You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2018/06/13 17:03:29 UTC

[geode] 01/01: GEODE-QueryProvider: add pointsConfigMap to support numeric query

This is an automated email from the ASF dual-hosted git repository.

zhouxj pushed a commit to branch feature/GEODE-QueryProvider
in repository https://gitbox.apache.org/repos/asf/geode.git

commit d92adb76bb23bcdb0c3f960e30e1c1cde0454838
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Wed Jun 13 10:01:34 2018 -0700

    GEODE-QueryProvider: add pointsConfigMap to support numeric query
---
 .../lucene/internal/LuceneIndexFactoryImpl.java    |  3 +-
 .../cache/lucene/internal/StringQueryProvider.java | 20 +++++++++++++
 .../serializer/HeterogeneousLuceneSerializer.java  | 33 ++++++++++++++++++++++
 .../serializer/ReflectionLuceneSerializer.java     |  4 +++
 4 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexFactoryImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexFactoryImpl.java
index 45d4fe1..0332954 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexFactoryImpl.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexFactoryImpl.java
@@ -22,11 +22,12 @@ import org.apache.lucene.analysis.standard.StandardAnalyzer;
 
 import org.apache.geode.cache.lucene.LuceneIndexFactory;
 import org.apache.geode.cache.lucene.LuceneSerializer;
+import org.apache.geode.cache.lucene.internal.repository.serializer.HeterogeneousLuceneSerializer;
 
 public class LuceneIndexFactoryImpl implements LuceneIndexFactory {
   private final LuceneServiceImpl service;
   private final Map<String, Analyzer> fields = new LinkedHashMap<String, Analyzer>();
-  private LuceneSerializer serializer;
+  private LuceneSerializer serializer = new HeterogeneousLuceneSerializer();
 
 
   public LuceneIndexFactoryImpl(final LuceneServiceImpl luceneService) {
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/StringQueryProvider.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/StringQueryProvider.java
index f0626b5..d0aeb24 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/StringQueryProvider.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/StringQueryProvider.java
@@ -18,16 +18,21 @@ package org.apache.geode.cache.lucene.internal;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Map;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
 import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser;
+import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig;
 import org.apache.lucene.search.Query;
 
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.lucene.LuceneIndex;
 import org.apache.geode.cache.lucene.LuceneQueryException;
 import org.apache.geode.cache.lucene.LuceneQueryProvider;
+import org.apache.geode.cache.lucene.LuceneSerializer;
+import org.apache.geode.cache.lucene.internal.repository.serializer.HeterogeneousLuceneSerializer;
 import org.apache.geode.internal.DataSerializableFixedID;
 import org.apache.geode.internal.Version;
 import org.apache.geode.internal.i18n.LocalizedStrings;
@@ -66,6 +71,21 @@ public class StringQueryProvider implements LuceneQueryProvider, DataSerializabl
     if (luceneQuery == null) {
       LuceneIndexImpl indexImpl = (LuceneIndexImpl) index;
       StandardQueryParser parser = new StandardQueryParser(indexImpl.getAnalyzer());
+      // parser.getQueryConfigHandler().set(StandardQueryConfigHandler.ConfigurationKeys.DATE_RESOLUTION,
+      // DateTools.Resolution.MILLISECOND);
+      Map<String, PointsConfig> pointsConfigMap = null;
+      LuceneSerializer serializer = index.getLuceneSerializer();
+      if (serializer instanceof HeterogeneousLuceneSerializer) {
+        HeterogeneousLuceneSerializer heteroSerializer = (HeterogeneousLuceneSerializer) serializer;
+        pointsConfigMap = heteroSerializer.getPointsConfigMap();
+      }
+      logger.info(serializer + ":" + Arrays.toString(indexImpl.getFieldNames()) + ":"
+              + parser.getDateResolution());
+      // pointsConfigMap.put("revenue", new PointsConfig(NumberFormat.getInstance(),
+      // Integer.class));
+      parser.setPointsConfigMap(pointsConfigMap);
+      // TODO: is DateTools.Resolution optional?
+      // parser.setDateResolution(DateTools.Resolution.MILLISECOND);
       parser.setAllowLeadingWildcard(true);
       try {
         luceneQuery = parser.parse(query, defaultField);
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/HeterogeneousLuceneSerializer.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/HeterogeneousLuceneSerializer.java
index 41281d5..160077a 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/HeterogeneousLuceneSerializer.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/HeterogeneousLuceneSerializer.java
@@ -14,12 +14,16 @@
  */
 package org.apache.geode.cache.lucene.internal.repository.serializer;
 
+import java.lang.reflect.Field;
+import java.text.NumberFormat;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.lucene.document.Document;
+import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig;
 
 import org.apache.geode.cache.lucene.LuceneIndex;
 import org.apache.geode.cache.lucene.LuceneSerializer;
@@ -45,6 +49,8 @@ public class HeterogeneousLuceneSerializer implements LuceneSerializer {
   private Map<Class<?>, LuceneSerializer> mappers =
       new CopyOnWriteWeakHashMap<Class<?>, LuceneSerializer>();
 
+  private Map<String, PointsConfig> pointsConfigMap = new HashMap();
+
   private static final Logger logger = LogService.getLogger();
 
   public HeterogeneousLuceneSerializer() {
@@ -89,4 +95,31 @@ public class HeterogeneousLuceneSerializer implements LuceneSerializer {
     }
   }
 
+  // TODO need a compute method to recalculate pointsConfigMap
+  public Map<String, PointsConfig> getPointsConfigMap() {
+    for (LuceneSerializer serializer : mappers.values()) {
+      if (serializer instanceof ReflectionLuceneSerializer) {
+        ReflectionLuceneSerializer reflectionSerializer = (ReflectionLuceneSerializer) serializer;
+        Field[] fields = reflectionSerializer.getFields();
+        for (Field field : fields) {
+          Class<?> type = field.getType();
+          if (type == int.class || type == Integer.class) {
+            pointsConfigMap.put(field.getName(),
+                new PointsConfig(NumberFormat.getInstance(), Integer.class));
+          } else if (type == float.class || type == Float.class) {
+            pointsConfigMap.put(field.getName(),
+                new PointsConfig(NumberFormat.getInstance(), Float.class));
+          } else if (type == long.class || type == Long.class) {
+            pointsConfigMap.put(field.getName(),
+                new PointsConfig(NumberFormat.getInstance(), Long.class));
+          } else if (type == double.class || type == Double.class) {
+            pointsConfigMap.put(field.getName(),
+                new PointsConfig(NumberFormat.getInstance(), Double.class));
+          }
+        }
+      }
+    }
+    return pointsConfigMap;
+  }
+
 }
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/ReflectionLuceneSerializer.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/ReflectionLuceneSerializer.java
index 947b2ad..e89ed90 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/ReflectionLuceneSerializer.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/ReflectionLuceneSerializer.java
@@ -82,4 +82,8 @@ class ReflectionLuceneSerializer implements LuceneSerializer {
     }
     return Collections.singleton(doc);
   }
+
+  public Field[] getFields() {
+    return fields;
+  }
 }

-- 
To stop receiving notification emails like this one, please contact
zhouxj@apache.org.