IGNITE-1753 WIP: added support for simple types in case of portables.

Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/852e54c0
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/852e54c0
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/852e54c0

Branch: refs/heads/ignite-1753-1282
Commit: 852e54c068915ecd9df86c850048afb7797a0a9e
Parents: 2961aaa
Author: Alexey Kuznetsov <akuznet...@apache.org>
Authored: Wed Oct 28 15:19:12 2015 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Wed Oct 28 15:19:12 2015 +0700

----------------------------------------------------------------------
 .../store/jdbc/CacheAbstractJdbcStore.java      | 21 ++++++++
 .../cache/store/jdbc/CacheJdbcPojoStore.java    | 57 ++++++++++++--------
 2 files changed, 55 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/852e54c0/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
index 576522c..4a81135 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java
@@ -30,6 +30,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -123,6 +124,26 @@ public abstract class CacheAbstractJdbcStore<K, V> 
implements CacheStore<K, V>,
     /** Connection attribute property name. */
     protected static final String ATTR_CONN_PROP = "JDBC_STORE_CONNECTION";
 
+    /** Simple types names. */
+    protected static Collection<String> SIMPLE_TYPES = new HashSet<>();
+
+    static {
+        SIMPLE_TYPES.add("java.math.BigDecimal");
+        SIMPLE_TYPES.add("java.lang.Boolean");
+        SIMPLE_TYPES.add("java.lang.Byte");
+        SIMPLE_TYPES.add("java.lang.Character");
+        SIMPLE_TYPES.add("java.lang.Double");
+        SIMPLE_TYPES.add("java.util.Date");
+        SIMPLE_TYPES.add("java.sql.Date");
+        SIMPLE_TYPES.add("java.lang.Float");
+        SIMPLE_TYPES.add("java.lang.Integer");
+        SIMPLE_TYPES.add("java.lang.Long");
+        SIMPLE_TYPES.add("java.lang.Short");
+        SIMPLE_TYPES.add("java.lang.String");
+        SIMPLE_TYPES.add("java.sql.Timestamp");
+        SIMPLE_TYPES.add("java.util.UUID");
+    }
+
     /** Auto-injected store session. */
     @CacheStoreSessionResource
     private CacheStoreSession ses;

http://git-wip-us.apache.org/repos/asf/ignite/blob/852e54c0/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
index 1724fa0..e3be95b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStore.java
@@ -32,6 +32,7 @@ import org.apache.ignite.IgnitePortables;
 import org.apache.ignite.cache.store.CacheStore;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.portable.PortableBuilder;
 import org.apache.ignite.portable.PortableObject;
 import org.jetbrains.annotations.Nullable;
@@ -47,7 +48,7 @@ public class CacheJdbcPojoStore<K, V> extends 
CacheAbstractJdbcStore<K, V> {
     private volatile Map<String, Map<String, PojoMethodsCache>> pojoMethods = 
Collections.emptyMap();
 
     /** Portables builders cache. */
-    private volatile Map<String, Map<String, Integer>> portableTypeIds = 
Collections.emptyMap();
+    private volatile Map<String, Map<String, IgniteBiTuple<Boolean, Integer>>> 
portableTypeIds = Collections.emptyMap();
 
     /**
      * Get field value from object for use as query parameter.
@@ -221,40 +222,50 @@ public class CacheJdbcPojoStore<K, V> extends 
CacheAbstractJdbcStore<K, V> {
      * @return Constructed portable object.
      * @throws CacheLoaderException If failed to construct portable object.
      */
-    protected PortableObject buildPortableObject(String cacheName, String 
typeName, JdbcTypeField[] fields,
+    protected Object buildPortableObject(String cacheName, String typeName, 
JdbcTypeField[] fields,
         Map<String, Integer> loadColIdxs, ResultSet rs) throws CacheException {
-        Map<String, Integer> cacheTypeIds = portableTypeIds.get(cacheName);
+        Map<String, IgniteBiTuple<Boolean, Integer>> cacheTypeIds = 
portableTypeIds.get(cacheName);
 
         if (cacheTypeIds == null)
             throw new CacheLoaderException("Failed to find portable types IDs 
for cache: " + cacheName);
 
-        Integer typeId = cacheTypeIds.get(typeName);
+        IgniteBiTuple<Boolean, Integer> tuple = cacheTypeIds.get(typeName);
 
-        if (typeId == null)
+        if (tuple == null)
             throw new CacheLoaderException("Failed to find portable type ID 
for type: " + typeName);
 
-        PortableBuilder builder = ignite.portables().builder(typeId);
+        try {
+            if (tuple.get1()) {
+                Object simple = null;
 
-        if (builder == null)
-            throw new CacheException("Failed to find portable builder for 
type: " + typeName);
+                if (fields.length > 0) {
+                    JdbcTypeField field = fields[0];
 
-        try {
-            int hashCode = 1;
+                    Integer colIdx = 
loadColIdxs.get(field.getDatabaseFieldName());
 
-            for (JdbcTypeField field : fields) {
-                Class<?> type = field.getJavaFieldType();
+                    simple = getColumnValue(rs, colIdx, 
field.getJavaFieldType());
+                }
+
+                return simple;
+            }
+            else {
+                PortableBuilder builder = 
ignite.portables().builder(tuple.get2());
 
-                Integer colIdx = loadColIdxs.get(field.getDatabaseFieldName());
+                int hashCode = 1;
 
-                Object colVal = getColumnValue(rs, colIdx, type);
+                for (JdbcTypeField field : fields) {
+                    Integer colIdx = 
loadColIdxs.get(field.getDatabaseFieldName());
 
-                if (colVal != null)
-                    hashCode = 31 * hashCode + colVal.hashCode();
+                    Object colVal = getColumnValue(rs, colIdx, 
field.getJavaFieldType());
 
-                builder.setField(field.getJavaFieldName(), colVal);
-            }
+                    if (colVal != null)
+                        hashCode = 31 * hashCode + colVal.hashCode();
 
-            return builder.hashCode(hashCode).build();
+                    builder.setField(field.getJavaFieldName(), colVal);
+                }
+
+                return builder.hashCode(hashCode).build();
+            }
         }
         catch (SQLException e) {
             throw new CacheException("Failed to read portable object", e);
@@ -354,7 +365,7 @@ public class CacheJdbcPojoStore<K, V> extends 
CacheAbstractJdbcStore<K, V> {
      */
     private void preparePortableBuilders(@Nullable String cacheName, 
Collection<JdbcType> types)
         throws CacheException {
-        Map<String, Integer> typeIds = U.newHashMap(types.size() * 2);
+        Map<String, IgniteBiTuple<Boolean, Integer>> typeIds = 
U.newHashMap(types.size() * 2);
 
         for (JdbcType type : types) {
             if (type.isKeepSerialized()) {
@@ -363,15 +374,15 @@ public class CacheJdbcPojoStore<K, V> extends 
CacheAbstractJdbcStore<K, V> {
                 IgnitePortables portables = ignite.portables();
 
                 String keyType = type.getKeyType();
-                typeIds.put(keyType, portables.typeId(keyType));
+                typeIds.put(keyType, new 
IgniteBiTuple<>(SIMPLE_TYPES.contains(keyType), portables.typeId(keyType)));
 
                 String valType = type.getValueType();
-                typeIds.put(valType, portables.typeId(valType));
+                typeIds.put(valType, new 
IgniteBiTuple<>(SIMPLE_TYPES.contains(valType), portables.typeId(valType)));
             }
         }
 
         if (!typeIds.isEmpty()) {
-            Map<String, Map<String, Integer>> newBuilders = new 
HashMap<>(portableTypeIds);
+            Map<String, Map<String, IgniteBiTuple<Boolean, Integer>>> 
newBuilders = new HashMap<>(portableTypeIds);
 
             newBuilders.put(cacheName, typeIds);
 

Reply via email to