Search code examples
javaspringsolrsolrjspring-data-solr

How to rounds down date filter query using spring data solr?


How can I rounds down date filter query using spring data solr?

I want to write query fq=startDate:[2013-06-14T23:59:59.999Z/DAY TO 2013-06-14T23:59:59.999Z/DAY] using FilterQuery.

How can I rounds down following query using FilterQuery ?

FilterQuery filterQuery = new SimpleFilterQuery();
filterQuery.addCriteria(new Criteria(EventDocument.FIELD_START_DATE).between(sc.getStartDate(), sc.getStartDate()));

Any Hint will be much appreciated.


Solution

  • The easiest would probably be to use SimpleStringCriteria

    String start = JavaDateConverter.INSTANCE.convert(sc.getStartDate())+"/DAY";
    String end = JavaDateConverter.INSTANCE.convert(sc.getEndDate())+"/DAY";
    Criteria criteria = new SimpleStringCriteria("[" + start + " TO " + end + "]");
    

    A bit more complex is registering a custom converter

    @Configuration
    @EnableSolrRepositories
    public class SolrContext {
    
      //..skipped solr server initialization to shorten
    
      @Bean
      public SolrTemplate solrTemplate() throws Exception {
        SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
        solrTemplate.setSolrCore("collection1"); 
        solrTemplate.registerQueryParser(SimpleQuery.class, queryParser());
        return solrTemplate;
      }
    
      @Bean  
      public QueryParser queryParser() {
        DefaultQueryParser queryParser = new DefaultQueryParser();
    
        //register custom converter for Date
        queryParser.registerConverter(RoundDayConverter.INSTANCE);
        return queryParser;
      }
    
      private enum RoundDayConverter implements Converter<Date, String> {
        INSTANCE;
    
        private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateTime().withZoneUTC();
    
        @Override
        public String convert(Date source) {
          if (source == null) {
            return "";
          }
    
          return ClientUtils.escapeQueryChars(FORMATTER.print(source.getTime())) + "/DAY";
        }
      }
    }
    

    As the above would apply to every Date it might be a good idea to create a custom type and register a converter for that.