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);