/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.schema; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.SolrInputDocument; import org.junit.BeforeClass; import org.junit.Test; public class NumericFieldsTest extends SolrTestCaseJ4 { @BeforeClass public static void beforeClass() throws Exception { initCore("solrconfig-basic.xml", "schema-numeric.xml"); } static String[] types = new String[]{"int", "long", "float", "double", "date"}; public static SolrInputDocument getDoc(String id, Integer number, String date) { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", id); for (String t : types) { if ("date".equals(t)) { doc.addField(t, date); doc.addField(t + "_last", date); doc.addField(t + "_first", date); } else { doc.addField(t, number); doc.addField(t + "_last", number); doc.addField(t + "_first", number); } } return doc; } @Test public void testSortMissingFirstLast() { clearIndex(); // NOTE: segments may be merged in any order, so we can't make any assumptions about // the relative order of M1 vs M2 unless we have a secondary sort assertU(adoc("id", "M1")); assertU(adoc(getDoc("+4", 4, "2011-04-04T00:00:00Z"))); assertU(adoc(getDoc("+5", 5, "2011-05-05T00:00:00Z"))); assertU(adoc(getDoc("-3", -3, "2011-01-01T00:00:00Z"))); assertU(adoc("id", "M2")); assertU(commit()); // 'normal' sorting. Missing Values are 0 String suffix = ""; for (String t : types) { if ("date".equals(t)) { assertQ("Sorting Asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][starts-with(.,'M')]", "//result/doc[2]/str[@name='id'][starts-with(.,'M')]", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][starts-with(.,'M')]", "//result/doc[5]/str[@name='id'][starts-with(.,'M')]" ); assertQ("Sorting Asc w/secondary on id desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc, id desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='M2']", "//result/doc[2]/str[@name='id'][.='M1']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc w/secondary on id asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc, id asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='M1']", "//result/doc[5]/str[@name='id'][.='M2']" ); } else { assertQ("Sorting Asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='-3']", "//result/doc[2]/str[@name='id'][starts-with(.,'M')]", "//result/doc[3]/str[@name='id'][starts-with(.,'M')]", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][starts-with(.,'M')]", "//result/doc[4]/str[@name='id'][starts-with(.,'M')]", "//result/doc[5]/str[@name='id'][.='-3']" ); assertQ("Sorting Asc w/secondary on id desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc, id desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='-3']", "//result/doc[2]/str[@name='id'][.='M2']", "//result/doc[3]/str[@name='id'][.='M1']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc w/secondary on id asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc, id asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='M1']", "//result/doc[4]/str[@name='id'][.='M2']", "//result/doc[5]/str[@name='id'][.='-3']" ); } } // sortMissingLast = true suffix = "_last"; for (String t : types) { assertQ("Sorting Asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='-3']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='+5']", "//result/doc[4]/str[@name='id'][starts-with(.,'M')]", "//result/doc[5]/str[@name='id'][starts-with(.,'M')]" ); assertQ("Sorting Desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][starts-with(.,'M')]", "//result/doc[5]/str[@name='id'][starts-with(.,'M')]" ); assertQ("Sorting Asc w/secondary on id desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc, id desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='-3']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='+5']", "//result/doc[4]/str[@name='id'][.='M2']", "//result/doc[5]/str[@name='id'][.='M1']" ); assertQ("Sorting Desc w/secondary on id asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc, id asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='+5']", "//result/doc[2]/str[@name='id'][.='+4']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='M1']", "//result/doc[5]/str[@name='id'][.='M2']" ); } // sortMissingFirst = true suffix = "_first"; for (String t : types) { assertQ("Sorting Asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][starts-with(.,'M')]", "//result/doc[2]/str[@name='id'][starts-with(.,'M')]", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][starts-with(.,'M')]", "//result/doc[2]/str[@name='id'][starts-with(.,'M')]", "//result/doc[3]/str[@name='id'][.='+5']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='-3']" ); assertQ("Sorting Asc w/secondary on id desc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " asc, id desc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='M2']", "//result/doc[2]/str[@name='id'][.='M1']", "//result/doc[3]/str[@name='id'][.='-3']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='+5']" ); assertQ("Sorting Desc w/secondary on id asc: " + t + suffix, req("fl", "id", "q", "*:*", "sort", (t + suffix) + " desc, id asc"), "//*[@numFound='5']", "//result/doc[1]/str[@name='id'][.='M1']", "//result/doc[2]/str[@name='id'][.='M2']", "//result/doc[3]/str[@name='id'][.='+5']", "//result/doc[4]/str[@name='id'][.='+4']", "//result/doc[5]/str[@name='id'][.='-3']" ); } } }