package com.intuit.tank.search.util;
/*
* #%L
* DocumentUtil
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.Date;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import com.intuit.tank.search.util.MultiSearchParam.Operator;
/**
* SearchUtils
*/
public class SearchUtils {
/**
* Padding represents padding to use on a number
*
* <br>
* Patterns:
*
* <br>
* Revisions: dangleton: May 20, 2008: Initial revision.
*
* @author dangleton
*/
public enum Padding {
TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8);
private final DecimalFormat format;
Padding(int numPlaces) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < numPlaces; i++) {
sb.append('0');
}
format = new DecimalFormat(sb.toString());
}
/**
*
* @return the decimal format associated with this Padding
*/
public DecimalFormat getFormat() {
return format;
}
}
private static final FastDateFormat DF = FastDateFormat.getInstance("yyyyMMddHHmm");
/**
* private constructor
*/
private SearchUtils() {
// unused constructor
}
/**
* pads the number to the specified padding.
*
* @param num
* the number to format
* @param padding
* the padding to use
* @return formatted number
*/
public static final String padInt(Number num, Padding padding) {
return padding.getFormat().format(num);
}
/**
* Formats the date to lexically correct format e.g. YYYYMMDDHHmm
*
* @param d
* the date to format
* @return the formatted date as a string
*/
public static final String formatDate(Date d) {
return DF.format(d);
}
/**
* creates a compound field term using the terms provided.
*
* @param delimiter
* the delimiter to use
* @param term
* varargs terms to concatenate
* @return the concatenated string separated by the delimiter.
*/
public static final String makeCompoundField(String delimiter, String... term) {
StringBuilder sb = new StringBuilder();
for (String s : term) {
if (s.length() != 0) {
if (delimiter != null && sb.length() != 0) {
sb.append(delimiter);
}
sb.append(s);
}
}
return sb.toString();
}
/**
* Builds the query.
*
* @param searchQuery
* the query meta object to build the query from
* @return Query the Lucene query object
*/
public static final Query createLuceneQuery(SearchQuery searchQuery) {
return createLuceneQuery(Operator.AND, searchQuery);
}
/**
* Builds the query.
*
* @param searchQuery
* the query meta object to build the query from
* @return Query the Lucene query object
*/
public static final Query createLuceneQuery(Operator operator, SearchQuery searchQuery) {
Query luceneQuery = new MultiSearchParam(operator, searchQuery.getSearchParams().toArray(new SearchParam[0]))
.getLuceneQuery();
return new MultiSearchParam(operator, searchQuery.getSearchParams().toArray(new SearchParam[0]))
.getLuceneQuery();
}
public static final Query createLuceneQuery(Operator operator, CompositeSearchQuery query) {
Query luceneQuery = new MultiSearchParam(query.getOperator(), query.getQuery1().getSearchParams()
.toArray((new SearchParam[0]))).getLuceneQuery();
Query otherLuceneQuery = new MultiSearchParam(Operator.OR, query.getQuery2().getSearchParams()
.toArray((new SearchParam[0]))).getLuceneQuery();
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(luceneQuery, operator.getOccur());
booleanQuery.add(otherLuceneQuery, query.getOperator().getOccur());
return booleanQuery;
}
/**
* returns a sort or null if no sort is specified.
*
* @param searchQuery
* the query containing the sorts
* @return the lucene sort or null if no sort is specified
*/
public static final Sort createLuceneSort(SearchQuery searchQuery) {
Sort ret = null;
Collection<SortOrder> sorts = searchQuery.getSortOrder();
if (!sorts.isEmpty()) {
SortField[] array = new SortField[sorts.size()];
int i = 0;
for (SortOrder sortOrder : sorts) {
array[i] = new SortField(sortOrder.getField(), SortField.STRING, sortOrder.isDescending());
}
ret = new Sort(array);
}
return ret;
}
}