Return-Path: X-Original-To: apmail-lucene-commits-archive@www.apache.org Delivered-To: apmail-lucene-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EF9AD10B96 for ; Mon, 20 Jan 2014 18:56:49 +0000 (UTC) Received: (qmail 79146 invoked by uid 500); 20 Jan 2014 18:56:49 -0000 Mailing-List: contact commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@lucene.apache.org Delivered-To: mailing list commits@lucene.apache.org Received: (qmail 79138 invoked by uid 99); 20 Jan 2014 18:56:49 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Jan 2014 18:56:49 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Jan 2014 18:56:47 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id BF76A2388994; Mon, 20 Jan 2014 18:56:26 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1559805 - in /lucene/dev/branches/lucene5376/lucene: demo/src/java/org/apache/lucene/demo/facet/ facet/src/java/org/apache/lucene/facet/range/ server/src/java/org/apache/lucene/server/ server/src/java/org/apache/lucene/server/handlers/ ser... Date: Mon, 20 Jan 2014 18:56:26 -0000 To: commits@lucene.apache.org From: mikemccand@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140120185626.BF76A2388994@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mikemccand Date: Mon Jan 20 18:56:25 2014 New Revision: 1559805 URL: http://svn.apache.org/r1559805 Log: LUCENE-5376: show how to do distance drill down with lucene server; clean up some tests Added: lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSimpleSpatial.java (with props) Modified: lucene/dev/branches/lucene5376/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java lucene/dev/branches/lucene5376/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRangeFacetCounts.java lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/handlers/RegisterFieldHandler.java lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/handlers/SearchHandler.java lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/package.html lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/ServerBaseTestCase.java lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestFacets.java lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSnapshots.java Modified: lucene/dev/branches/lucene5376/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java (original) +++ lucene/dev/branches/lucene5376/lucene/demo/src/java/org/apache/lucene/demo/facet/DistanceFacetsExample.java Mon Jan 20 18:56:25 2014 @@ -108,7 +108,6 @@ public class DistanceFacetsExample imple /** User runs a query and counts facets. */ public FacetResult search() throws IOException { - FacetsCollector fc = new FacetsCollector(); searcher.search(new MatchAllDocsQuery(), fc); Modified: lucene/dev/branches/lucene5376/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRangeFacetCounts.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRangeFacetCounts.java?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRangeFacetCounts.java (original) +++ lucene/dev/branches/lucene5376/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRangeFacetCounts.java Mon Jan 20 18:56:25 2014 @@ -71,7 +71,6 @@ public class DoubleRangeFacetCounts exte LongRange[] longRanges = new LongRange[ranges.length]; for(int i=0;i dynamicFields) throws IOException { Map dsDimMap = new HashMap(); if (drillSidewaysDims != null) { @@ -1655,13 +1656,18 @@ public class SearchHandler extends Handl for(Object o2 : r.getList("facets")) { Request r2 = (Request) o2; - - FieldDef fd = state.getField(r2, "dim"); + String fieldName = r2.getString("dim"); + FieldDef fd = dynamicFields.get(fieldName); + if (fd == null) { + r2.fail("dim", "field \"" + fieldName + "\" was not registered and was not specified as a dynamicField"); + // Dead code but compiler disagrees: + fd = null; + } FacetResult facetResult; if (r2.hasParam("numericRanges")) { - if (!fd.faceted.equals("numericRange")) { + if (fd.faceted != null && !fd.faceted.equals("numericRange")) { r2.fail("numericRanges", "field \"" + fd.name + "\" was not registered with facet=numericRange"); } if (fd.valueType.equals("int") || fd.valueType.equals("long")) { @@ -1685,7 +1691,7 @@ public class SearchHandler extends Handl c, ranges); facetResult = facets.getTopChildren(0, fd.name); - } else if (fd.valueType.equals("float") || fd.valueType.equals("double")) { + } else if (fd.valueType.equals("float") || fd.valueType.equals("double") || fd.valueType.equals("virtual")) { List rangeList = r2.getList("numericRanges"); DoubleRange[] ranges = new DoubleRange[rangeList.size()]; for(int i=0;i dynamicFields = getDynamicFields(state, r); + final Map dynamicFields = getDynamicFields(state, r); Query q = extractQuery(state, r, timeStamp, useBlockJoinCollector, dynamicFields); @@ -2164,7 +2178,7 @@ public class SearchHandler extends Handl @Override protected Facets buildFacetsResult(FacetsCollector drillDowns, FacetsCollector[] drillSideways, String[] drillSidewaysDims) throws IOException { - fillFacetResults(r, s, drillDowns, drillSideways, drillSidewaysDims, indexState, facetResults); + fillFacetResults(r, s, drillDowns, drillSideways, drillSidewaysDims, indexState, facetResults, dynamicFields); return null; } Modified: lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/package.html URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/package.html?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/package.html (original) +++ lucene/dev/branches/lucene5376/lucene/server/src/java/org/apache/lucene/server/package.html Mon Jan 20 18:56:25 2014 @@ -29,6 +29,10 @@ joins, grouping, highlighting, suggest, live-values, snapshots, etc. +
  • Lucene's legacy FieldCache is never used; only the + faster, more RAM efficient doc values are used when you + sort, group, facet on a field. +
  • All searching is based on near-real-time IndexReader; you configure the minimum and maximum refresh times. @@ -60,8 +64,8 @@ searching.
  • A server thread pool handles all concurrency during - indexing, so you a single client thread can use the bulk - indexing API and take advantage of the server computer's + indexing, so a single client thread using the bulk + indexing API will take advantage of the server computer's concurrent hardware.
  • Settings are divided into live settings, which Modified: lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/ServerBaseTestCase.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/ServerBaseTestCase.java?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/ServerBaseTestCase.java (original) +++ lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/ServerBaseTestCase.java Mon Jan 20 18:56:25 2014 @@ -54,13 +54,25 @@ public abstract class ServerBaseTestCase private static Thread serverThread; static int port; + /** Current index name; we auto-insert this to outgoing + * commands that need it. */ + protected static String curIndexName = "index"; protected static boolean useDefaultIndex = true; protected static File STATE_DIR; + /** Last result from the server; tests can access this to + * check results. */ protected static JSONObject lastResult; + /** We record the last indexGen we saw return from the + * server, and then insert that for search command if no + * searcher is already specified. This avoids a common + * test bug of forgetting to specify which indexGen to + * search. */ + private static long lastIndexGen = -1; + @BeforeClass public static void beforeClassServerBase() throws Exception { File dir = _TestUtil.getTempDir("ServerBase"); @@ -78,6 +90,7 @@ public abstract class ServerBaseTestCase @Override public void setUp() throws Exception { super.setUp(); + lastIndexGen = -1; if (useDefaultIndex) { curIndexName = "index"; @@ -178,6 +191,7 @@ public abstract class ServerBaseTestCase serverThread.join(); serverThread = null; } + lastIndexGen = -1; } protected static void deleteAllDocs() throws Exception { @@ -249,6 +263,15 @@ public abstract class ServerBaseTestCase args.put("indexName", curIndexName); } + if (command.equals("search") && args.containsKey("searcher") == false && lastIndexGen != -1) { + if (VERBOSE) { + System.out.println("\nNOTE: ServerBaseTestCase: inserting 'searcher: {indexGen: " + lastIndexGen + "}' into search request"); + } + JSONObject o = new JSONObject(); + o.put("indexGen", lastIndexGen); + args.put("searcher", o); + } + if (VERBOSE) { System.out.println("\nNOTE: ServerBaseTestCase: sendRaw command=" + command + " args:\n" + args.toJSONString(new JSONStyleIdent())); } @@ -259,6 +282,13 @@ public abstract class ServerBaseTestCase System.out.println("NOTE: ServerBaseTestCase: server response:\n" + lastResult.toJSONString(new JSONStyleIdent())); } + if (lastResult.containsKey("indexGen")) { + lastIndexGen = getLong(lastResult, "indexGen"); + if (VERBOSE) { + System.out.println("NOTE: ServerBaseTestCase: record lastIndexGen=" + lastIndexGen); + } + } + return lastResult; } @@ -370,7 +400,7 @@ public abstract class ServerBaseTestCase /** Simple xpath-like utility method to jump down and grab * something out of the JSON response. */ - protected Object get(Object o, String path) { + protected static Object get(Object o, String path) { int upto = 0; int tokStart = 0; boolean inArrayIndex = false; @@ -414,63 +444,63 @@ public abstract class ServerBaseTestCase return o; } - protected String getString(Object o, String path) { + protected static String getString(Object o, String path) { return (String) get(o, path); } - protected String getString(String path) { + protected static String getString(String path) { return getString(lastResult, path); } - protected int getInt(Object o, String path) { + protected static int getInt(Object o, String path) { return ((Number) get(o, path)).intValue(); } - protected int getInt(String path) { + protected static int getInt(String path) { return getInt(lastResult, path); } - protected boolean getBoolean(Object o, String path) { + protected static boolean getBoolean(Object o, String path) { return ((Boolean) get(o, path)).booleanValue(); } - protected boolean getBoolean(String path) { + protected static boolean getBoolean(String path) { return getBoolean(lastResult, path); } - protected long getLong(Object o, String path) { + protected static long getLong(Object o, String path) { return ((Number) get(o, path)).longValue(); } - protected long getLong(String path) { + protected static long getLong(String path) { return getLong(lastResult, path); } - protected float getFloat(Object o, String path) { + protected static float getFloat(Object o, String path) { return ((Number) get(o, path)).floatValue(); } - protected float getFloat(String path) { + protected static float getFloat(String path) { return getFloat(lastResult, path); } - protected JSONObject getObject(Object o, String path) { + protected static JSONObject getObject(Object o, String path) { return (JSONObject) get(o, path); } - protected JSONObject getObject(String path) { + protected static JSONObject getObject(String path) { return getObject(lastResult, path); } - protected JSONArray getArray(Object o, String path) { + protected static JSONArray getArray(Object o, String path) { return (JSONArray) get(o, path); } - protected JSONArray getArray(String path) { + protected static JSONArray getArray(String path) { return getArray(lastResult, path); } - protected JSONArray getArray(JSONArray o, int index) { + protected static JSONArray getArray(JSONArray o, int index) { return (JSONArray) o.get(index); } Modified: lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestFacets.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestFacets.java?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestFacets.java (original) +++ lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestFacets.java Mon Jan 20 18:56:25 2014 @@ -156,29 +156,21 @@ public class TestFacets extends ServerBa deleteAllDocs(); addDocument(0, "Bob", "this is a test", 10.99f, "2012/10/17"); addDocument(1, "Lisa", "this is a another test", 11.99f, "2012/10/1"); - long gen = addDocument(2, "Frank", "this is a third test", 12.99f, "2010/10/1"); - JSONObject o = search("test", gen, "price", false, true, null, null); - assertEquals(3, ((Number) o.get("totalHits")).intValue()); - - JSONArray hits = (JSONArray) o.get("hits"); - assertEquals(3, hits.size()); - - JSONObject hit = (JSONObject) hits.get(0); - assertEquals(0, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2012/10/17", ((JSONObject) hit.get("fields")).get("date")); - - hit = (JSONObject) hits.get(1); - assertEquals(1, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2012/10/1", ((JSONObject) hit.get("fields")).get("date")); - - hit = (JSONObject) hits.get(2); - assertEquals(2, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2010/10/1", ((JSONObject) hit.get("fields")).get("date")); - JSONArray facets = getArray(o, "facets[0].counts"); - assertEquals(3, facets.size()); - assertEquals("[\"top\",3]", facets.get(0).toString()); - assertEquals("[\"2012\",2]", facets.get(1).toString()); - assertEquals("[\"2010\",1]", facets.get(2).toString()); + addDocument(2, "Frank", "this is a third test", 12.99f, "2010/10/1"); + search("test", -1, "price", false, true, null, null); + assertEquals(3, getInt("totalHits")); + assertEquals(3, getInt("hits.length")); + + assertEquals(0, getInt("hits[0].fields.id")); + assertEquals("2012/10/17", getString("hits[0].fields.date")); + + assertEquals(1, getInt("hits[1].fields.id")); + assertEquals("2012/10/1", getString("hits[1].fields.date")); + + assertEquals(2, getInt("hits[2].fields.id")); + assertEquals("2010/10/1", getString("hits[2].fields.date")); + + assertEquals("top: 3, 2012: 2, 2010: 1", formatFacetCounts(getObject("facets[0]"))); } public void testFacetsReopen() throws Exception { @@ -187,30 +179,21 @@ public class TestFacets extends ServerBa addDocument(1, "Lisa", "this is a another test", 11.99f, "2012/10/1"); commit(); - long gen = addDocument(2, "Frank", "this is a third test", 12.99f, "2010/10/1"); - JSONObject o = search("test", gen, "price", false, true, null, null); - assertEquals(3, ((Number) o.get("totalHits")).intValue()); - - JSONArray hits = (JSONArray) o.get("hits"); - assertEquals(3, hits.size()); - - JSONObject hit = (JSONObject) hits.get(0); - assertEquals(0, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2012/10/17", ((JSONObject) hit.get("fields")).get("date")); - - hit = (JSONObject) hits.get(1); - assertEquals(1, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2012/10/1", ((JSONObject) hit.get("fields")).get("date")); - - hit = (JSONObject) hits.get(2); - assertEquals(2, ((JSONObject) hit.get("fields")).get("id")); - assertEquals("2010/10/1", ((JSONObject) hit.get("fields")).get("date")); - - JSONArray facets = getArray(o, "facets[0].counts"); - assertEquals(3, facets.size()); - assertEquals("[\"top\",3]", facets.get(0).toString()); - assertEquals("[\"2012\",2]", facets.get(1).toString()); - assertEquals("[\"2010\",1]", facets.get(2).toString()); + addDocument(2, "Frank", "this is a third test", 12.99f, "2010/10/1"); + search("test", -1, "price", false, true, null, null); + assertEquals(3, getInt("totalHits")); + assertEquals(3, getInt("hits.length")); + + assertEquals(0, getInt("hits[0].fields.id")); + assertEquals("2012/10/17", getString("hits[0].fields.date")); + + assertEquals(1, getInt("hits[1].fields.id")); + assertEquals("2012/10/1", getString("hits[1].fields.date")); + + assertEquals(2, getInt("hits[2].fields.id")); + assertEquals("2010/10/1", getString("hits[2].fields.date")); + + assertEquals("top: 3, 2012: 2, 2010: 1", formatFacetCounts(getObject("facets[0]"))); } public void testDrillSideways() throws Exception { @@ -220,48 +203,40 @@ public class TestFacets extends ServerBa send("addDocument", "{fields: {author: Lisa}}"); send("addDocument", "{fields: {author: Tom}}"); send("addDocument", "{fields: {author: Tom}}"); - long indexGen = getLong(send("addDocument", "{fields: {author: Tom}}"), "indexGen"); + send("addDocument", "{fields: {author: Tom}}"); // Initial query: - JSONObject o = send("search", String.format(Locale.ROOT, "{query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}], searcher: {indexGen: %d}}", indexGen)); - assertEquals(6, o.get("totalHits")); - assertEquals("[[\"top\",6],[\"Tom\",3],[\"Lisa\",2],[\"Bob\",1]]", getArray(o, "facets[0].counts").toString()); + send("search", "{query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}]}"); + assertEquals(6, getInt("totalHits")); + assertEquals("top: 6, Tom: 3, Lisa: 2, Bob: 1", formatFacetCounts(getObject("facets[0]"))); // Now, single drill down: - o = send("search", String.format(Locale.ROOT, "{drillDowns: [{field: author, value: Bob}], query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}], searcher: {indexGen: %d}}", indexGen)); - assertEquals(1, o.get("totalHits")); - assertEquals("[[\"top\",6],[\"Tom\",3],[\"Lisa\",2],[\"Bob\",1]]", getArray(o, "facets[0].counts").toString()); + send("search", "{drillDowns: [{field: author, value: Bob}], query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}]}"); + assertEquals(1, getInt("totalHits")); + assertEquals("top: 6, Tom: 3, Lisa: 2, Bob: 1", formatFacetCounts(getObject("facets[0]"))); // Multi (OR'd) drill down: - o = send("search", String.format(Locale.ROOT, "{drillDowns: [{field: author, value: Bob}, {field: author, value: Lisa}], query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}], searcher: {indexGen: %d}}", indexGen)); - assertEquals(3, o.get("totalHits")); - assertEquals("[[\"top\",6],[\"Tom\",3],[\"Lisa\",2],[\"Bob\",1]]", getArray(o, "facets[0].counts").toString()); + send("search", "{drillDowns: [{field: author, value: Bob}, {field: author, value: Lisa}], query: MatchAllDocsQuery, facets: [{dim: author, topN: 10}]}"); + assertEquals(3, getInt("totalHits")); + assertEquals("top: 6, Tom: 3, Lisa: 2, Bob: 1", formatFacetCounts(getObject("facets[0]"))); } public void testLongRangeFacets() throws Exception { deleteAllDocs(); - long gen = -1; for(int i=0;i<100;i++) { - gen = getLong(send("addDocument", "{fields: {longField: " + i + "}}"), "indexGen"); + send("addDocument", "{fields: {longField: " + i + "}}"); } - JSONObject o = send("search", "{facets: [{dim: longField, numericRanges: [{label: All, min: 0, max: 99, minInclusive: true, maxInclusive: true}, {label: Half, min: 0, max: 49, minInclusive: true, maxInclusive: true}]}], searcher: {indexGen: " + gen + "}}"); - assertEquals("All", getString(o, "facets[0].counts[1][0]")); - assertEquals(100, getInt(o, "facets[0].counts[1][1]")); - assertEquals("Half", getString(o, "facets[0].counts[2][0]")); - assertEquals(50, getInt(o, "facets[0].counts[2][1]")); + send("search", "{facets: [{dim: longField, numericRanges: [{label: All, min: 0, max: 99, minInclusive: true, maxInclusive: true}, {label: Half, min: 0, max: 49, minInclusive: true, maxInclusive: true}]}]}"); + assertEquals("top: 100, All: 100, Half: 50", formatFacetCounts(getObject("facets[0]"))); } public void testDoubleRangeFacets() throws Exception { deleteAllDocs(); - long gen = -1; for(int i=0;i<100;i++) { - gen = getLong(send("addDocument", "{fields: {doubleField: " + i + "}}"), "indexGen"); + send("addDocument", "{fields: {doubleField: " + i + "}}"); } - JSONObject o = send("search", "{facets: [{dim: doubleField, numericRanges: [{label: All, min: 0, max: 99, minInclusive: true, maxInclusive: true}, {label: Half, min: 0, max: 49, minInclusive: true, maxInclusive: true}]}], searcher: {indexGen: " + gen + "}}"); - assertEquals("All", getString(o, "facets[0].counts[1][0]")); - assertEquals(100, getInt(o, "facets[0].counts[1][1]")); - assertEquals("Half", getString(o, "facets[0].counts[2][0]")); - assertEquals(50, getInt(o, "facets[0].counts[2][1]")); + send("search", "{facets: [{dim: doubleField, numericRanges: [{label: All, min: 0, max: 99, minInclusive: true, maxInclusive: true}, {label: Half, min: 0, max: 49, minInclusive: true, maxInclusive: true}]}]}"); + assertEquals("top: 100, All: 100, Half: 50", formatFacetCounts(getObject("facets[0]"))); } // nocommit fails ... we need to add FloatRangeFacetCounts @@ -319,15 +294,15 @@ public class TestFacets extends ServerBa send("addDocument", "{fields: {ssdv: three}}"); send("commit"); send("addDocument", "{fields: {ssdv: one}}"); - long indexGen = getLong(send("addDocument", "{fields: {ssdv: one}}"), "indexGen"); + send("addDocument", "{fields: {ssdv: one}}"); for(int i=0;i<2;i++) { // nocommit if i remove indexGen from here, the error // message is bad: it says "each element in the array // my have these params:..." when it shouldn't - JSONObject result = send("search", "{query: MatchAllDocsQuery, facets: [{dim: ssdv}], searcher: {indexGen: " + indexGen + "}}"); - assertEquals(6, getInt(result, "totalHits")); - assertEquals("[[\"top\",6],[\"one\",3],[\"two\",2],[\"three\",1]]", getArray(result, "facets[0].counts").toString()); + send("search", "{query: MatchAllDocsQuery, facets: [{dim: ssdv}]}"); + assertEquals(6, getInt("totalHits")); + assertEquals("top: 6, one: 3, two: 2, three: 1", formatFacetCounts(getObject("facets[0]"))); // Make sure suggest survives server restart: shutdownServer(); @@ -335,5 +310,20 @@ public class TestFacets extends ServerBa send("startIndex"); } } + + public static String formatFacetCounts(JSONObject facets) { + StringBuilder sb = new StringBuilder(); + JSONArray arr = getArray(facets, "counts"); + for(Object o : arr) { + JSONArray facet = (JSONArray) o; + sb.append(facet.get(0)); + sb.append(": "); + sb.append(facet.get(1)); + sb.append(", "); + } + String s = sb.toString(); + // remove last ', ': + return s.substring(0, s.length()-2); + } } Added: lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSimpleSpatial.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSimpleSpatial.java?rev=1559805&view=auto ============================================================================== --- lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSimpleSpatial.java (added) +++ lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSimpleSpatial.java Mon Jan 20 18:56:25 2014 @@ -0,0 +1,79 @@ +package org.apache.lucene.server; + +/* + * 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. + */ + +import java.io.File; +import java.util.Locale; + +import org.apache.lucene.util._TestUtil; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import net.minidev.json.JSONArray; +import net.minidev.json.JSONObject; + +/** Simple example of how to do distance drill-downs. */ +public class TestSimpleSpatial extends ServerBaseTestCase { + + @BeforeClass + public static void init() throws Exception { + useDefaultIndex = false; + curIndexName = "spatial"; + startServer(); + createAndStartIndex(); + } + + @AfterClass + public static void fini() throws Exception { + shutdownServer(); + } + + public void test() throws Exception { + + // Record latitude and longitude as double fields: + send("registerFields", + "{fields: {latitude: {type: double, storeDocValues: true}, longitude: {type: double, storeDocValues: true}}}"); + + // Index 3 documents each with its own location: + send("addDocument", "{fields: {latitude: 40.759011, longitude: -73.9844722}}"); + send("addDocument", "{fields: {latitude: 40.718266, longitude: -74.007819}}"); + send("addDocument", "{fields: {latitude: 40.7051157, longitude: -74.0088305}}"); + + // Search, matching all documents and counting distance + // facets from the home origin: + double homeLatitude = 40.7143528; + double homeLongitude = -74.0059731; + send("search", + "{query: MatchAllDocsQuery, " + + "virtualFields: [{name: distance, expression: 'haversin(" + homeLatitude + "," + homeLongitude + ",latitude,longitude)'}], " + + "facets: [{dim: distance, numericRanges: [" + + "{label: '< 1 km', min: 0.0, minInclusive: true, max: 1.0, maxInclusive: false}," + + "{label: '< 2 km', min: 0.0, minInclusive: true, max: 2.0, maxInclusive: false}," + + "{label: '< 5 km', min: 0.0, minInclusive: true, max: 5.0, maxInclusive: false}," + + "{label: '< 10 km', min: 0.0, minInclusive: true, max: 10.0, maxInclusive: false}," + + "]}]}"); + + // Search, matching all documents and counting distance + // facets from the home origin: + assertEquals(3, getInt("totalHits")); + assertEquals("top: 3, < 1 km: 1, < 2 km: 2, < 5 km: 2, < 10 km: 3", + TestFacets.formatFacetCounts(getObject("facets[0]"))); + + // nocommit show drill down too + } +} + Modified: lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSnapshots.java URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSnapshots.java?rev=1559805&r1=1559804&r2=1559805&view=diff ============================================================================== --- lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSnapshots.java (original) +++ lucene/dev/branches/lucene5376/lucene/server/src/test/org/apache/lucene/server/TestSnapshots.java Mon Jan 20 18:56:25 2014 @@ -66,7 +66,8 @@ public class TestSnapshots extends Serve send("deleteDocuments", "{field: id, values: ['0']}"); send("registerFields", "{fields: {field: {type: 'atom'}}}"); send("addDocument", "{fields: {body: 'here is the body', id: '1', facet: 'facet2', field: 'abc'}}"); - long indexGen2 = getLong(send("addDocument", "{fields: {body: 'here is the body', id: '2', facet: 'facet2', field: 'abc'}}"), "indexGen"); + send("addDocument", "{fields: {body: 'here is the body', id: '2', facet: 'facet2', field: 'abc'}}"); + long indexGen2 = getLong("indexGen"); commit(); File backupDir = _TestUtil.getTempDir("backup"); @@ -91,14 +92,14 @@ public class TestSnapshots extends Serve } // Make sure we can search the snapshot and only get 1 hit: - JSONObject searchResult = send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); - assertEquals(1, getInt(searchResult, "totalHits")); - assertEquals("0", getString(searchResult, "hits[0].fields.id")); + send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); + assertEquals(1, getInt("totalHits")); + assertEquals("0", getString("hits[0].fields.id")); // Make sure we can search the current searcher and we // get 2 hits: - searchResult = send("search", "{retrieveFields: [id], searcher: {indexGen: " + indexGen2 + "}, query: MatchAllDocsQuery}"); - assertEquals(2, getInt(searchResult, "totalHits")); + send("search", "{retrieveFields: [id], searcher: {indexGen: " + indexGen2 + "}, query: MatchAllDocsQuery}"); + assertEquals(2, getInt("totalHits")); // Bounce the server: shutdownServer(); @@ -106,14 +107,14 @@ public class TestSnapshots extends Serve send("startIndex"); // Make sure we can search the snapshot and still only get 1 hit: - searchResult = send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); - assertEquals(1, getInt(searchResult, "totalHits")); - assertEquals("0", getString(searchResult, "hits[0].fields.id")); + send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); + assertEquals(1, getInt("totalHits")); + assertEquals("0", getString("hits[0].fields.id")); // Make sure we can search the current searcher and we // get 2 hits: - searchResult = send("search", "{retrieveFields: [id], query: MatchAllDocsQuery}"); - assertEquals(2, getInt(searchResult, "totalHits")); + send("search", "{retrieveFields: [id], query: MatchAllDocsQuery}"); + assertEquals(2, getInt("totalHits")); // Make sure files still exist (snapshot persisted): for(Map.Entry ent : result.entrySet()) { @@ -129,9 +130,9 @@ public class TestSnapshots extends Serve } // Make sure we can still search the snapshot: - searchResult = send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); - assertEquals(1, getInt(searchResult, "totalHits")); - assertEquals("0", getString(searchResult, "hits[0].fields.id")); + send("search", "{retrieveFields: [id], searcher: {snapshot: \"" + snapshotID + "\"}, query: MatchAllDocsQuery}"); + assertEquals(1, getInt("totalHits")); + assertEquals("0", getString("hits[0].fields.id")); // Now, release the snapshot: send("releaseSnapshot", "{id: \"" + snapshotID + "\"}");