blob: 6e6d445c5ef8c0a47436b9fd2ba8105fb8e4bf85 [file] [log] [blame]
/**
*
*/
package org.eclipse.smila.solr.query;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import junit.framework.TestCase;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.params.FacetParams;
import org.apache.solr.common.util.DateUtil;
import org.eclipse.smila.blackboard.Blackboard;
import org.eclipse.smila.blackboard.BlackboardAccessException;
import org.eclipse.smila.blackboard.impl.BlackboardFactoryImpl;
import org.eclipse.smila.datamodel.AnyMap;
import org.eclipse.smila.datamodel.AnySeq;
import org.eclipse.smila.datamodel.DataFactory;
import org.eclipse.smila.datamodel.Record;
import org.eclipse.smila.datamodel.xml.XmlSerializationUtils;
import org.eclipse.smila.search.api.QueryConstants;
import org.eclipse.smila.search.api.QueryConstants.SortOrder;
import org.eclipse.smila.solr.SolrConfig;
import org.eclipse.smila.solr.SolrConstants;
import org.eclipse.smila.solr.SolrConstants.FacetSort;
// import org.eclipse.smila.solr.SolrConstants.ErrorHandling;
import org.eclipse.smila.solr.params.QueryParams;
/**
* @author pwissel
*
*/
public class QueryTransformer_Test extends TestCase {
final DataFactory _factory = DataFactory.DEFAULT;
final String idField = "id";
private SolrConfig getSolrConfig() {
final AnyMap config = _factory.createAnyMap();
final AnyMap idFields = config.getMap(SolrConfig.ID_FIELDS, true);
idFields.put(idField, idField);
final SolrConfig solrConfig = new SolrConfig(config);
return solrConfig;
}
public void test_addCommonQueryParameters() {
final Record record = _factory.createRecord("addCommonQueryParameters");
final SolrQueryBuilder SolrQueryBuilder = new SolrQueryBuilder(record);
SolrQueryBuilder.setOffset(10);
SolrQueryBuilder.setMaxCount(20);
SolrQueryBuilder.addResultAttributes("fl1");
SolrQueryBuilder.addResultAttributes("fl2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addCommonQueryParameters(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected = "start=10&rows=20&fl=fl1,fl2";
assertEquals(expected, actual);
}
public void test_addCommonQueryParametersDefault() {
final Record record = _factory.createRecord("addCommonQueryParameters");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addCommonQueryParameters(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected = "start=0&rows=10";
assertEquals(expected, actual);
}
public void test_addQuery() {
final Record record = _factory.createRecord("addQuery");
new SolrQueryBuilder(record).setQuery("expression");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addQuery(new SolrQuery());
final String actual = query.toString();
final String expected = "q=expression";
assertEquals(expected, actual);
}
public void test_addQueryPhrase() {
final Record record = _factory.createRecord("addQueryPhrase");
new SolrQueryBuilder(record).setQuery("\"expression phrase\"");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addQuery(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected = "q=\"expression phrase\"";
assertEquals(expected, actual);
}
public void test_addQueryLucene() {
final Record record = _factory.createRecord("addQueryLucene");
new SolrQueryBuilder(record).setQuery("field1:expression1 AND field2:expression2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addQuery(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected = "q=field1:expression1 AND field2:expression2";
assertEquals(expected, actual);
}
public void test_addQueryFielded() {
final Record record = _factory.createRecord("addQueryFielded");
final SolrQueryBuilder SolrQueryBuilder = new SolrQueryBuilder(record);
SolrQueryBuilder.setQueryAttribute("field1", "expression1");
SolrQueryBuilder.setQueryAttribute("field2", new Object[] { "expression21", "expression22" });
SolrQueryBuilder.setQueryAttribute("field3", "\"expression 3 as a phrase\"");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addQuery(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected =
"q=field1:expression1 field2:(expression21 expression22) field3:\"expression 3 as a phrase\"";
assertEquals(expected, actual);
}
public void test_addQuerySeq() {
final Record record = _factory.createRecord("addQueryFielded");
final AnySeq querySeq = record.getMetadata().getSeq(QueryConstants.QUERY, true);
querySeq.add("searchWord");
querySeq.add("searchWord2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addQuery(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException exception) {
fail(exception.getMessage());
}
final String expected = "q=searchWord searchWord2";
assertEquals(expected, actual);
}
public void test_addNativeParams() {
final Record record = _factory.createRecord("addNativeParams");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addNative("parameter", "val1");
solrQueryBuilder.addNative("parameter", "val3");
solrQueryBuilder.setNative("parameter2", "val2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addNativeParams(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "parameter=val1&parameter=val3&parameter2=val2";
assertEquals(expected, actual);
}
public void test_addNativeParamsDefault() {
final Record record = _factory.createRecord("addNativeParams");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addNativeParams(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "";
assertEquals(expected, actual);
}
public void test_addHighlighting() {
final Record record = _factory.createRecord("addHighlighting");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addHighlightField("hlField");
solrQueryBuilder.addHighlightByAttribute("attrib", "hlAttrib2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addHighlighting(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "hl.fl=hlField&hl.fl=attrib&hl.fl=hlAttrib2&hl=true";
assertEquals(expected, actual);
}
public void test_addHighlighting2() {
final Record record = _factory.createRecord("addHighlighting");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addHighlightField("hlField");
solrQueryBuilder.addHighlightByAttribute("attrib", "hlAttrib2");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addCommonQueryParameters(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "start=0&rows=10&fl=" + idField;
assertEquals(expected, actual);
}
public void test_addHighlightingDefault() {
final Record record = _factory.createRecord("addHighlighting");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addHighlighting(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "";
assertEquals(expected, actual);
}
public void test_addSorting() {
final Record record = _factory.createRecord("addSorting");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addSortBy("sortingAttribute", SortOrder.ASCENDING);
solrQueryBuilder.addSortBy("sortingAttribute2", SortOrder.DESCENDING);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addSorting(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "sort=sortingAttribute asc,sortingAttribute2 desc";
assertEquals(expected, actual);
}
public void test_addSorting2() {
final Record record = _factory.createRecord("addSorting");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addSortBy("sortingAttribute2", SortOrder.DESCENDING);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addSorting(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "sort=sortingAttribute2 desc";
assertEquals(expected, actual);
}
public void test_addSortingDefault() {
final Record record = _factory.createRecord("addSorting");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query = new QueryTransformer(queryParams, getSolrConfig(), idField).addSorting(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "";
assertEquals(expected, actual);
}
public void test_addFacettingAttribute() {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
sqb.addFacetByAttribute("attribute");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals("facet.field=attribute&facet=true", query.toString());
}
public void test_addFacettingAttributeSortBy() throws UnsupportedEncodingException {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
sqb.addFacetByAttribute("attribute");
final AnySeq facetBySeq = record.getMetadata().getSeq(QueryConstants.FACETBY);
facetBySeq.getMap(0).getMap(QueryConstants.SORTBY, true).put(QueryConstants.FACETBY_SORTCRITERION, "index");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final QueryTransformer queryTransformer = new QueryTransformer(queryParams, getSolrConfig(), idField);
final SolrQuery solrQuery = new SolrQuery();
queryTransformer.addFaceting(solrQuery);
final SolrQuery query = queryTransformer.addFilters(solrQuery);
assertEquals("f.attribute." + FacetParams.FACET_SORT + "=index&" + FacetParams.FACET_FIELD + "=attribute&"
+ FacetParams.FACET + "=true", query.toString());
}
public void test_addFacettingQuery() {
// TODO see QueryTransformer Line 222
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
sqb.addFacetQuery("queryText");
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
System.out.println(query.toString());
// assertEquals("facet.field=attribute&facet=true", query.toString());
}
public void test_addFacettingRangeDate() throws UnsupportedEncodingException {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
final Date start = new Date(0);
final Date end = new Date(5000000);
final String gap = "+1";
sqb.addFacetByRange("range", start, end, gap);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals(
FacetParams.FACET_RANGE + "=range&" + "f." + SolrConstants.RANGE + "." + FacetParams.FACET_RANGE_START + "="
+ URLEncoder.encode(DateUtil.getThreadLocalDateFormat().format(start), "UTF-8") + "&f."
+ SolrConstants.RANGE + "." + FacetParams.FACET_RANGE_END + "="
+ URLEncoder.encode(DateUtil.getThreadLocalDateFormat().format(end), "UTF-8") + "&f." + SolrConstants.RANGE
+ "." + FacetParams.FACET_RANGE_GAP + "=" + URLEncoder.encode(gap, "UTF-8") + "&" + FacetParams.FACET
+ "=true", query.toString());
}
public void test_addFacettingRangeNumber() {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
final Number start = 1.0;
final Number end = 10.0;
final Number gap = 2.0;
sqb.addFacetByRange("range", start, end, gap);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals(FacetParams.FACET_RANGE + "=range&" + "f." + SolrConstants.RANGE + "."
+ FacetParams.FACET_RANGE_START + "=" + start + "&f." + SolrConstants.RANGE + "."
+ FacetParams.FACET_RANGE_END + "=" + end + "&f." + SolrConstants.RANGE + "." + FacetParams.FACET_RANGE_GAP
+ "=" + gap + "&" + FacetParams.FACET + "=true", query.toString());
}
public void test_addFacettingInterval() {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
final String interval = "interval";
final String test_value1 = "part1";
final String test_value2 = "part2";
sqb.addFacetInterval(interval, new String[] { test_value1, test_value2 });
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals(FacetParams.FACET + "=true&" + FacetParams.FACET_INTERVAL + "=" + interval + "&f." + interval
+ "." + FacetParams.FACET_INTERVAL_SET + "=" + test_value1 + "&f." + interval + "."
+ FacetParams.FACET_INTERVAL_SET + "=" + test_value2, query.toString());
}
public void test_addFacettingPivot() {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
final String test_value1 = "pivot1";
final String test_value2 = "pivot2";
sqb.addFacetPivot(test_value1, test_value2);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals(FacetParams.FACET_FIELD + "=" + test_value1 + "&" + FacetParams.FACET_FIELD + "=" + test_value2
+ "&" + FacetParams.FACET + "=true", query.toString());
}
public void test_addFacettingPivot2() {
final Record record = _factory.createRecord("addFacetting");
final SolrQueryBuilder sqb = new SolrQueryBuilder(record);
final String test_value1 = "pivot1";
final String test_value2 = "pivot2";
final String test_value3 = "pivot3";
sqb.addFacetPivot(test_value1, test_value2);
sqb.addFacetPivot(test_value3);
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addFaceting(new SolrQuery());
assertEquals(FacetParams.FACET_FIELD + "=" + test_value1 + "&" + FacetParams.FACET_FIELD + "=" + test_value2
+ "&" + FacetParams.FACET_FIELD + "=" + test_value3 + "&" + FacetParams.FACET + "=true", query.toString());
}
public void test_addGrouping() {
final Record record = _factory.createRecord("test_addGrouping");
final SolrQueryBuilder solrQueryBuilder = new SolrQueryBuilder(record);
solrQueryBuilder.addGroupByAttribute("groupValue1");
solrQueryBuilder.addGroupByFunctionQuery("functionQuery");
solrQueryBuilder.addGroupByQuery("query");
System.out.println(XmlSerializationUtils.serialize2string(record));
final QueryParams queryParams = new QueryParams(null, record.getMetadata(), null);
final SolrQuery query =
new QueryTransformer(queryParams, getSolrConfig(), idField).addGrouping(new SolrQuery());
String actual = null;
try {
actual = URLDecoder.decode(query.toString(), "UTF-8");
} catch (final UnsupportedEncodingException e) {
fail(e.getMessage());
}
final String expected = "group=true&group.field=groupValue1&group.func=functionQuery&group.query=query";
assertEquals(expected, actual);
}
public void test_FilterAllOf() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterAllOf");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
final AnySeq allOf = filter.getSeq(QueryConstants.FILTER_ALLOF, true);
allOf.add("f1");
allOf.add("f2");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=+(field:f1)+(field:f2)";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterNoneOf() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterNoneOf");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
final AnySeq allOf = filter.getSeq(QueryConstants.FILTER_NONEOF, true);
allOf.add("f1");
allOf.add("f2");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=-(field:f1)-(field:f2)";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterOneOf() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterOneOf");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
final AnySeq allOf = filter.getSeq(QueryConstants.FILTER_ONEOF, true);
allOf.add("f1");
allOf.add("f2");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq= (field:f1) (field:f2)";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterAtLeast() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterAtLeast");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
filter.put(QueryConstants.FILTER_ATLEAST, "least");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=+(field:[least TO *])";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterAtMost() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterAtMost");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
filter.put(QueryConstants.FILTER_ATMOST, "most");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=+(field:[* TO most])";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterGreaterThan() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterGreaterThan");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
filter.put(QueryConstants.FILTER_GREATERTHAN, "greater");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=-(field:greater)+(field:[greater TO *])";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterLowerThan() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterLowerThan");
final AnyMap filter = _factory.createAnyMap();
filter.put(QueryConstants.ATTRIBUTE, "field");
filter.put(QueryConstants.FILTER_LESSTHAN, "lower");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=-(field:lower)+(field:[* TO lower])";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterMultiple() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterMultiple");
final AnyMap filter1 = _factory.createAnyMap();
filter1.put(QueryConstants.ATTRIBUTE, "field1");
final AnySeq allOf = filter1.getSeq(QueryConstants.FILTER_ONEOF, true);
allOf.add("f1");
allOf.add("f2");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter1);
final AnyMap filter2 = _factory.createAnyMap();
filter2.put(QueryConstants.ATTRIBUTE, "field2");
filter2.put(QueryConstants.FILTER_ATMOST, "most");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter2);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=+(field2:[* TO most])&fq= (field1:f1) (field1:f2)";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FilterGroup() throws Exception {
// prepare record
final Record record = _factory.createRecord("test_FilterGroup");
final AnyMap filter1 = _factory.createAnyMap();
filter1.put(QueryConstants.ATTRIBUTE, "field1");
final AnySeq allOf = filter1.getSeq(QueryConstants.FILTER_ONEOF, true);
allOf.add("f1");
allOf.add("f2");
filter1.put(SolrConstants.GROUP, "group");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter1);
final AnyMap filter2 = _factory.createAnyMap();
filter2.put(QueryConstants.ATTRIBUTE, "field2");
filter2.put(QueryConstants.FILTER_ATMOST, "most");
filter2.put(SolrConstants.GROUP, "group");
record.getMetadata().getSeq(QueryConstants.FILTER, true).add(filter2);
final QueryTransformer transformer = getQueryTransformer(record);
final String query = transformer.addFilters(new SolrQuery()).toString();
final String expected = "fq=+( (field1:f1) (field1:f2))+(+(field2:[* TO most]))";
final String actual = URLDecoder.decode(query, "UTF-8");
assertEquals(expected, actual);
}
public void test_FacetAttribute() throws Exception {
final Record record = _factory.createRecord("test_FacetAttribute");
final AnyMap facet = _factory.createAnyMap();
facet.put(QueryConstants.ATTRIBUTE, "field");
record.getMetadata().getSeq(QueryConstants.FACETBY, true).add(facet);
final String query = getQueryString(record);
final String[] expected = { "facet=true", "facet.field=field" };
final String[] actual = getQueryParts(query);
assertEqualQueryParts(expected, actual);
}
public void test_FacetSettings() throws Exception {
final Record record = _factory.createRecord("test_FacetSettings");
final AnyMap facet = _factory.createAnyMap();
facet.put(QueryConstants.ATTRIBUTE, "field");
facet.put(QueryConstants.MAXCOUNT, 5);
facet.getMap(QueryConstants.SORTBY, true).put(QueryConstants.FACETBY_SORTCRITERION, FacetSort.INDEX.toString());
record.getMetadata().getSeq(QueryConstants.FACETBY, true).add(facet);
final String query = getQueryString(record);
final String[] expected =
{ "facet=true", "facet.field=field", "f.field.facet.limit=5", "f.field.facet.sort=index" };
final String[] actual = getQueryParts(query);
assertEqualQueryParts(expected, actual);
}
public void test_FacetLocalParams() throws Exception {
final Record record = _factory.createRecord("test_FacetLocalParams");
final AnyMap facet = _factory.createAnyMap();
facet.put(QueryConstants.ATTRIBUTE, "field");
facet.getMap(SolrConstants.LOCAL_PARAMS, true).put(QueryStringConstants.KEY, "key");
record.getMetadata().getSeq(QueryConstants.FACETBY, true).add(facet);
final String query = getQueryString(record);
final String[] expected = { "facet=true", "facet.field={!key=key}field" };
final String[] actual = getQueryParts(query);
assertEqualQueryParts(expected, actual);
}
public void test_FacetFilter() throws Exception {
final Record record = _factory.createRecord("test_FacetFilter");
final AnyMap facet = _factory.createAnyMap();
facet.put(QueryConstants.ATTRIBUTE, "field");
final AnyMap filter = _factory.createAnyMap();
filter.getSeq(QueryConstants.FILTER_ONEOF, true).add("f1");
filter.getSeq(QueryConstants.FILTER_ONEOF, true).add("f2");
facet.getSeq(QueryConstants.FILTER, true).add(filter);
record.getMetadata().getSeq(QueryConstants.FACETBY, true).add(facet);
final QueryTransformer transformer = getQueryTransformer(record);
final SolrQuery solrQuery = transformer.addFaceting(new SolrQuery());
final String query = transformer.addFilters(solrQuery).toString();
final String[] expected = { "facet=true", "facet.field=field", "fq= (field:f1) (field:f2)" };
final String[] actual = getQueryParts(query);
assertEqualQueryParts(expected, actual);
}
public void test_FacetFilterMultiselect() throws Exception {
final Record record = _factory.createRecord("test_FacetFilterMultiselect");
final AnyMap facet = _factory.createAnyMap();
facet.put(QueryConstants.ATTRIBUTE, "field");
facet.put(SolrConstants.MULTISELECT, true);
final AnyMap filter = _factory.createAnyMap();
filter.getSeq(QueryConstants.FILTER_ONEOF, true).add("f1");
filter.getSeq(QueryConstants.FILTER_ONEOF, true).add("f2");
facet.getSeq(QueryConstants.FILTER, true).add(filter);
record.getMetadata().getSeq(QueryConstants.FACETBY, true).add(facet);
final QueryTransformer transformer = getQueryTransformer(record);
final SolrQuery solrQuery = transformer.addFaceting(new SolrQuery());
final String query = transformer.addFilters(solrQuery).toString();
final String[] expected =
{ "facet=true", "facet.field={!ex=fq_field}field", "fq={!tag=fq_field} (field:f1) (field:f2)" };
final String[] actual = getQueryParts(query);
assertEqualQueryParts(expected, actual);
}
private void assertEqualQueryParts(final String[] expected, final String[] actual) {
final String expectedString = StringUtils.join(expected, ',');
final String actualString = StringUtils.join(actual, ',');
String message =
String.format("Query parts must be same length!. expected (%s): '%s'. actual (%s): '%s'.", expected.length,
expectedString, actual.length, actualString);
assertTrue(message, ArrayUtils.isSameLength(expected, actual));
for (final String queryPart : expected) {
message =
String.format("'%s' must be part of the query. expected: '%s'. actual: '%s'.", queryPart, expectedString,
actualString);
assertTrue(message, ArrayUtils.indexOf(actual, queryPart) != ArrayUtils.INDEX_NOT_FOUND);
}
}
private String[] getQueryParts(final String queryString) throws UnsupportedEncodingException {
final String query = URLDecoder.decode(queryString, "UTF-8");
return StringUtils.split(query, '&');
}
private String getQueryString(final Record record) throws BlackboardAccessException {
final QueryTransformer transformer = getQueryTransformer(record);
return transformer.addFaceting(new SolrQuery()).toString();
}
private QueryTransformer getQueryTransformer(final Record record) throws BlackboardAccessException {
// prepare transformer
final QueryParams params = getQueryParams(record);
final SolrConfig config = getSolrConfig2();
final String index = "test";
return new QueryTransformer(params, config, index);
}
private SolrConfig getSolrConfig2() {
// prepare config
final AnyMap config = _factory.createAnyMap();
config.getMap(SolrConfig.ID_FIELDS, true).put("test", "id");
return new SolrConfig(config);
}
private QueryParams getQueryParams(final Record record) throws BlackboardAccessException {
// prepare params
final String id = record.getId();
final Blackboard blackboard = new BlackboardFactoryImpl().createTransientBlackboard();
blackboard.setRecord(record);
return new QueryParams(blackboard, id);
}
}