Solr DateToLongTransfomer: Convert Date to Milliseconds


Scenario
During develop and debug one Solr feature, I constantly need check the value of date field.
In response, the date field is string, but in eclipse debug mode, the value is long(milliseconds from epoch time) - as Solr actually stores the milliseconds in index, so why not write one transformer that add the milliseconds into response.

Here it is.
DateToLongTransfomerFactory
public class DateToLongTransfomerFactory extends TransformerFactory {
  @Override
  public DocTransformer create(String field, SolrParams params,
      SolrQueryRequest req) {
    return new DateToLongTransfomer(field, params);
  }
  
  /**
   * org.apache.solr.search.SolrReturnFields.parseFieldList(String[],
   * SolrQueryRequest) DocTransformers augmenters = new DocTransformers();
   * 
   * DocTransformer is thread safe.
   */
  private static class DateToLongTransfomer extends DocTransformer {
    private String fl;
    private String field;
    
    public DateToLongTransfomer(String field, SolrParams params) {
      // field is the name of transformer [dateToLong]
      this.field = field;
      fl = Preconditions.checkNotNull(params.get("fl"),
          "fl can't be null in transfromer");
    }
    
    @Override
    public void transform(SolrDocument doc, int docid) throws IOException {
      String fieldValue = getFieldValue(doc, fl);
      if (fieldValue != null) {
        doc.addField(field, fieldValue);
      }
    }
    
  public static String getFieldValue(SolrDocument doc, String field) {
    List<String> rst = new ArrayList<String>();
    Object obj = doc.get(field);
    getFieldvalues(doc, rst, obj);
    
    if (rst.isEmpty()) {
      return null;
    }
    return rst.get(0);
  }    

  public static void getFieldvalues(SolrDocument doc, List<String> rst,
      Object obj) {
    if (obj == null) return;
    if (obj instanceof org.apache.lucene.document.Field) {
      org.apache.lucene.document.Field field = (Field) obj;
      String oldValue = field.stringValue();
      if (oldValue != null) {
        rst.add(oldValue);
      }
    } else if (obj instanceof IndexableField) {
      IndexableField field = (IndexableField) obj;
      String oldValue = field.stringValue();
      if (oldValue != null) {
        rst.add(oldValue);
      }
    } else if (obj instanceof Collection) {
      Collection colls = (Collection) obj;
      for (Object newObj : colls) {
        getFieldvalues(doc, rst, newObj);
      }
    } else {
      rst.add(obj.toString());
      // throw new RuntimeException("When this is called? obj.type:"
      // + obj.getClass());
    }
  }    
  }
}

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)