You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2015/09/01 18:14:29 UTC

[2/2] incubator-geode git commit: Adding a query method to IndexRepository

Adding a query method to IndexRepository

This method takes a result collector that receives a gemfire key and
score for each result.


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/e4220113
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/e4220113
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/e4220113

Branch: refs/heads/feature/GEODE-11
Commit: e4220113e0939436eeea90acb32ad4c5a77957de
Parents: 6682507
Author: Dan Smith <up...@apache.org>
Authored: Mon Aug 31 17:13:15 2015 -0700
Committer: Dan Smith <up...@apache.org>
Committed: Mon Aug 31 17:13:15 2015 -0700

----------------------------------------------------------------------
 .../internal/repository/IndexRepository.java    | 15 +++++++++
 .../repository/IndexRepositoryImpl.java         | 35 +++++++++++++++++---
 .../repository/IndexResultCollector.java        | 16 +++++++++
 .../IndexRepositoryImplJUnitTest.java           | 28 ++++++++--------
 4 files changed, 76 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4220113/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepository.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepository.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepository.java
index dac206d..549bf21 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepository.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepository.java
@@ -2,6 +2,8 @@ package com.gemstone.gemfire.cache.lucene.internal.repository;
 
 import java.io.IOException;
 
+import org.apache.lucene.search.Query;
+
 /**
  * An Repository interface for the writing data to lucene.
  */
@@ -24,6 +26,19 @@ public interface IndexRepository {
    * @throws IOException 
    */
   void delete(Object key) throws IOException;
+  
+  /**
+   * Query the index index repository, passing the results to the collector
+   * Only the documents with the top scores, up to the limit, will be passed
+   * to the collector, in order of score.
+   * 
+   * @param query
+   * @param limit the maximum number of hits to return
+   * @param collector the class to aggregate the hits
+   * 
+   * @throws IOException
+   */
+  public void query(Query query, int limit, IndexResultCollector collector) throws IOException;
 
   /**
    * Commit the changes to all lucene index

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4220113/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImpl.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImpl.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImpl.java
index 5fb7ae7..57037d1 100644
--- a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImpl.java
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImpl.java
@@ -3,22 +3,34 @@ package com.gemstone.gemfire.cache.lucene.internal.repository;
 import java.io.IOException;
 
 import org.apache.lucene.document.Document;
+import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopDocs;
 
-import com.gemstone.gemfire.cache.lucene.internal.repository.serializer.SerializerUtil;
 import com.gemstone.gemfire.cache.lucene.internal.repository.serializer.LuceneSerializer;
+import com.gemstone.gemfire.cache.lucene.internal.repository.serializer.SerializerUtil;
 
 /**
  * A repository that writes to a single lucene index writer
  */
 public class IndexRepositoryImpl implements IndexRepository {
   
+  private static final boolean APPLY_ALL_DELETES = System
+      .getProperty("gemfire.IndexRepository.APPLY_ALL_DELETES", "true")
+      .equalsIgnoreCase("true");
+  
   private final IndexWriter writer;
   private final LuceneSerializer serializer;
+  private volatile DirectoryReader reader;
+  private volatile IndexSearcher searcher;
   
-  public IndexRepositoryImpl(IndexWriter writer, LuceneSerializer serializer) {
+  public IndexRepositoryImpl(IndexWriter writer, LuceneSerializer serializer) throws IOException {
     this.writer = writer;
+    reader = DirectoryReader.open(writer, APPLY_ALL_DELETES);
     this.serializer = serializer;
   }
 
@@ -45,8 +57,23 @@ public class IndexRepositoryImpl implements IndexRepository {
   }
 
   @Override
-  public void commit() throws IOException {
-    writer.commit();
+  public void query(Query query, int limit, IndexResultCollector collector) throws IOException {
+    IndexSearcher searcherSnapshot = searcher;
+    TopDocs docs = searcherSnapshot.search(query, limit);
+    for(ScoreDoc scoreDoc : docs.scoreDocs) {
+      Document doc = searcher.doc(scoreDoc.doc);
+      Object key = SerializerUtil.getKey(doc);
+      collector.collect(key, scoreDoc.score);
+    }
   }
 
+  @Override
+  public synchronized void commit() throws IOException {
+    writer.commit();
+    DirectoryReader newReader = DirectoryReader.openIfChanged(reader);
+    if(newReader != null) {
+      reader = newReader;
+      searcher = new IndexSearcher(reader);
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4220113/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexResultCollector.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexResultCollector.java b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexResultCollector.java
new file mode 100644
index 0000000..fd78b11
--- /dev/null
+++ b/gemfire-lucene/src/main/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexResultCollector.java
@@ -0,0 +1,16 @@
+package com.gemstone.gemfire.cache.lucene.internal.repository;
+
+/**
+ * Interface for collection results of a query on 
+ * an IndexRepository. See {@link IndexRepository#query(org.apache.lucene.search.Query, int, IndexResultCollector)}
+ */
+public interface IndexResultCollector {
+
+  /**
+   * Collect a single document
+   * @param key the gemfire key of the object
+   * @param score the lucene score of this object
+   */
+  void collect(Object key, float score);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/e4220113/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java
----------------------------------------------------------------------
diff --git a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java
index e47b7bd..f4a994b 100644
--- a/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java
+++ b/gemfire-lucene/src/test/java/com/gemstone/gemfire/cache/lucene/internal/repository/IndexRepositoryImplJUnitTest.java
@@ -42,7 +42,6 @@ public class IndexRepositoryImplJUnitTest {
 
   private IndexRepositoryImpl repo;
   private HeterogenousLuceneSerializer mapper;
-  private DirectoryReader reader;
   private StandardAnalyzer analyzer = new StandardAnalyzer();
   private IndexWriter writer;
 
@@ -53,7 +52,6 @@ public class IndexRepositoryImplJUnitTest {
     RegionDirectory dir = new RegionDirectory(fileRegion, chunkRegion);
     IndexWriterConfig config = new IndexWriterConfig(analyzer);
     writer = new IndexWriter(dir, config);
-    reader = DirectoryReader.open(writer, true);
     String[] indexedFields= new String[] {"s", "i", "l", "d", "f", "s2", "missing"};
     mapper = new HeterogenousLuceneSerializer(indexedFields);
     repo = new IndexRepositoryImpl(writer, mapper);
@@ -118,22 +116,24 @@ public class IndexRepositoryImplJUnitTest {
 
   private void checkQuery(String queryTerm, String queryField, Object ... expectedKeys)
       throws IOException, ParseException {
+    Set<Object> expectedSet = new HashSet<Object>();
+    expectedSet.addAll(Arrays.asList(expectedKeys));
+    
     QueryParser parser = new QueryParser(queryField, analyzer);
     
-    DirectoryReader result = DirectoryReader.openIfChanged(reader);
-    reader = result == null ? reader : result;
-    IndexSearcher searcher = new IndexSearcher(reader);
-    TopDocs results = searcher.search(parser.parse(queryTerm), 100);
+    KeyCollector collector = new KeyCollector();
+    repo.query(parser.parse(queryTerm), 100, collector);
     
-    Set<Object> expectedSet = new HashSet<Object>();
-    expectedSet.addAll(Arrays.asList(expectedKeys));
-    Set<Object> actualKeys = new HashSet<Object>();
-    for(ScoreDoc scoreDoc: results.scoreDocs) {
-      Document doc = searcher.doc(scoreDoc.doc);
-      assertEquals(1, doc.getFields().size());
-      actualKeys.add(SerializerUtil.getKey(doc));
+    assertEquals(expectedSet, collector.results);
+  }
+  
+  private static class KeyCollector implements IndexResultCollector {
+
+    Set<Object> results = new HashSet<Object>();
+    @Override
+    public void collect(Object key, float score) {
+      results.add(key);
     }
-    assertEquals(expectedSet, actualKeys);
   }
 
   /**