You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2015/10/28 09:19:12 UTC
[4/4] ignite git commit: IGNITE-1753 WIP: added support for simple
types in case of portables.
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 <ak...@apache.org>
Authored: Wed Oct 28 15:19:12 2015 +0700
Committer: Alexey Kuznetsov <ak...@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);