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/21 00:38:18 UTC

[geode] branch feature/GEODE-QueryProvider updated: Support numeric fields in PdxLuceneSerializer

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


The following commit(s) were added to refs/heads/feature/GEODE-QueryProvider by this push:
     new 1440ac0  Support numeric fields in PdxLuceneSerializer
1440ac0 is described below

commit 1440ac066061ada4d1a23dc69e3bffeb36ba9807
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Wed Jun 20 17:37:23 2018 -0700

    Support numeric fields in PdxLuceneSerializer
---
 .../serializer/HeterogeneousLuceneSerializer.java  | 23 ++++------------------
 .../repository/serializer/PdxLuceneSerializer.java | 21 ++++++++++++++++++++
 .../serializer/ReflectionLuceneSerializer.java     | 16 +++++++++++++--
 3 files changed, 39 insertions(+), 21 deletions(-)

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 160077a..6fbb675 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,8 +14,6 @@
  */
 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;
@@ -97,26 +95,13 @@ public class HeterogeneousLuceneSerializer implements LuceneSerializer {
 
   // TODO need a compute method to recalculate pointsConfigMap
   public Map<String, PointsConfig> getPointsConfigMap() {
+    PdxLuceneSerializer pdxSerializer = (PdxLuceneSerializer) pdxMapper;
+    pointsConfigMap.putAll(pdxSerializer.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));
-          }
-        }
+        pointsConfigMap.putAll(reflectionSerializer.getPointsConfigMap());
       }
     }
     return pointsConfigMap;
diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/PdxLuceneSerializer.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/PdxLuceneSerializer.java
index b644548..11308b1 100644
--- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/PdxLuceneSerializer.java
+++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/repository/serializer/PdxLuceneSerializer.java
@@ -15,11 +15,15 @@
 
 package org.apache.geode.cache.lucene.internal.repository.serializer;
 
+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;
@@ -32,9 +36,25 @@ import org.apache.geode.pdx.PdxInstance;
 class PdxLuceneSerializer implements LuceneSerializer {
 
   private static final Logger logger = LogService.getLogger();
+  private Map<String, PointsConfig> pointsConfigMap = new HashMap();
 
   public PdxLuceneSerializer() {}
 
+  private void saveNumericFields(String fieldName, Object fieldValue) {
+    Class<?> clazz = fieldValue.getClass();
+    if (pointsConfigMap.get(fieldName) == null) {
+      if (clazz == Long.class || clazz == Integer.class || clazz == Float.class
+          || clazz == Double.class) {
+        pointsConfigMap.put(fieldName,
+            new PointsConfig(NumberFormat.getInstance(), (Class<? extends Number>) clazz));
+      }
+    }
+  }
+
+  public Map<String, PointsConfig> getPointsConfigMap() {
+    return pointsConfigMap;
+  }
+
   @Override
   public Collection<Document> toDocuments(LuceneIndex index, Object value) {
     Document doc = new Document();
@@ -46,6 +66,7 @@ class PdxLuceneSerializer implements LuceneSerializer {
           continue;
         }
         SerializerUtil.addField(doc, field, fieldValue);
+        saveNumericFields(field, fieldValue);
       }
     }
     if (logger.isDebugEnabled()) {
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 e89ed90..ea14f12 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
@@ -16,15 +16,19 @@
 package org.apache.geode.cache.lucene.internal.repository.serializer;
 
 import java.lang.reflect.Field;
+import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 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;
@@ -37,6 +41,7 @@ import org.apache.geode.internal.logging.LogService;
 class ReflectionLuceneSerializer implements LuceneSerializer {
 
   private Field[] fields;
+  private Map<String, PointsConfig> pointsConfigMap = new HashMap();
 
   private static final Logger logger = LogService.getLogger();
 
@@ -54,6 +59,12 @@ class ReflectionLuceneSerializer implements LuceneSerializer {
         if (fieldSet.contains(field.getName()) && SerializerUtil.isSupported(type)) {
           field.setAccessible(true);
           foundFields.add(field);
+
+          if (type == Long.class || type == Integer.class || type == Float.class
+              || type == Double.class) {
+            pointsConfigMap.put(field.getName(),
+                new PointsConfig(NumberFormat.getInstance(), (Class<? extends Number>) type));
+          }
         }
       }
 
@@ -83,7 +94,8 @@ class ReflectionLuceneSerializer implements LuceneSerializer {
     return Collections.singleton(doc);
   }
 
-  public Field[] getFields() {
-    return fields;
+  public Map<String, PointsConfig> getPointsConfigMap() {
+    return pointsConfigMap;
   }
+
 }