You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2017/02/08 10:41:10 UTC
ignite git commit: Revert "IGNITE-4363: SQL: fixed inner property
updates for DML operations."
Repository: ignite
Updated Branches:
refs/heads/master e6cc8cdab -> bb1ac0a5c
Revert "IGNITE-4363: SQL: fixed inner property updates for DML operations."
This reverts commit 70cd8e452b94b806a2fe6fe00b4b67ce80eb4373.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/bb1ac0a5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/bb1ac0a5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/bb1ac0a5
Branch: refs/heads/master
Commit: bb1ac0a5cfecf4af7e8dcfe86efc75997895c431
Parents: e6cc8cd
Author: devozerov <vo...@gridgain.com>
Authored: Wed Feb 8 13:40:02 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Feb 8 13:40:02 2017 +0300
----------------------------------------------------------------------
.../configuration/CacheConfiguration.java | 16 +--
.../processors/query/GridQueryProcessor.java | 81 ++++----------
.../processors/query/GridQueryProperty.java | 21 ++--
.../query/h2/DmlStatementsProcessor.java | 69 ++++++------
.../query/h2/dml/UpdatePlanBuilder.java | 105 ++++++-------------
...niteCacheAbstractInsertSqlQuerySelfTest.java | 4 -
.../IgniteCacheAbstractSqlDmlQuerySelfTest.java | 2 +-
.../IgniteCacheInsertSqlQuerySelfTest.java | 22 ----
.../cache/IgniteCacheMergeSqlQuerySelfTest.java | 24 -----
.../IgniteCacheUpdateSqlQuerySelfTest.java | 63 ++---------
.../h2/GridIndexingSpiAbstractSelfTest.java | 5 -
11 files changed, 111 insertions(+), 301 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index f0179ca..0656dda 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -2358,13 +2358,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
prop.parent(parent);
- // Add parent property before its possible nested properties so that
- // resulting parent column comes before columns corresponding to those
- // nested properties in the resulting table - that way nested
- // properties override will happen properly (first parent, then children).
- type.addProperty(prop, key, true);
-
processAnnotation(key, sqlAnn, txtAnn, field.getType(), prop, type);
+
+ type.addProperty(prop, key, true);
}
}
@@ -2384,13 +2380,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
prop.parent(parent);
- // Add parent property before its possible nested properties so that
- // resulting parent column comes before columns corresponding to those
- // nested properties in the resulting table - that way nested
- // properties override will happen properly (first parent, then children).
- type.addProperty(prop, key, true);
-
processAnnotation(key, sqlAnn, txtAnn, mtd.getReturnType(), prop, type);
+
+ type.addProperty(prop, key, true);
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 5bfdde8..a239ee2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -64,7 +64,6 @@ import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.binary.BinaryObjectEx;
-import org.apache.ignite.internal.binary.BinaryObjectExImpl;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheEntryImpl;
@@ -1949,7 +1948,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
/**
* Description of type property.
*/
- private static class ClassProperty implements GridQueryProperty {
+ private static class ClassProperty extends GridQueryProperty {
/** */
private final PropertyAccessor accessor;
@@ -2042,17 +2041,12 @@ public class GridQueryProcessor extends GridProcessorAdapter {
@Override public String toString() {
return S.toString(ClassProperty.class, this);
}
-
- /** {@inheritDoc} */
- @Override public GridQueryProperty parent() {
- return parent;
- }
}
/**
*
*/
- private class BinaryProperty implements GridQueryProperty {
+ private class BinaryProperty extends GridQueryProperty {
/** Property name. */
private String propName;
@@ -2136,17 +2130,11 @@ public class GridQueryProcessor extends GridProcessorAdapter {
obj = isKeyProp0 == 1 ? key : val;
}
- if (obj instanceof BinaryObject) {
- BinaryObject obj0 = (BinaryObject) obj;
- return fieldValue(obj0);
- }
- else if (obj instanceof BinaryObjectBuilder) {
- BinaryObjectBuilder obj0 = (BinaryObjectBuilder)obj;
+ assert obj instanceof BinaryObject;
- return obj0.getField(name());
- }
- else
- throw new IgniteCheckedException("Unexpected binary object class [type=" + obj.getClass() + ']');
+ BinaryObject obj0 = (BinaryObject)obj;
+
+ return fieldValue(obj0);
}
/** {@inheritDoc} */
@@ -2156,38 +2144,10 @@ public class GridQueryProcessor extends GridProcessorAdapter {
if (obj == null)
return;
- Object srcObj = obj;
-
- if (!(srcObj instanceof BinaryObjectBuilder))
- throw new UnsupportedOperationException("Individual properties can be set for binary builders only");
-
- if (parent != null)
- obj = parent.value(key, val);
-
- boolean needsBuild = false;
-
- if (obj instanceof BinaryObjectExImpl) {
- if (parent == null)
- throw new UnsupportedOperationException("Individual properties can be set for binary builders only");
-
- needsBuild = true;
-
- obj = ((BinaryObjectExImpl)obj).toBuilder();
- }
-
if (!(obj instanceof BinaryObjectBuilder))
throw new UnsupportedOperationException("Individual properties can be set for binary builders only");
setValue0((BinaryObjectBuilder) obj, propName, propVal, type());
-
- if (needsBuild) {
- obj = ((BinaryObjectBuilder) obj).build();
-
- assert parent != null;
-
- // And now let's set this newly constructed object to parent
- setValue0((BinaryObjectBuilder) srcObj, parent.propName, obj, obj.getClass());
- }
}
/**
@@ -2264,11 +2224,6 @@ public class GridQueryProcessor extends GridProcessorAdapter {
return isKeyProp0 == 1;
}
-
- /** {@inheritDoc} */
- @Override public GridQueryProperty parent() {
- return parent;
- }
}
/**
@@ -2352,12 +2307,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
/** {@inheritDoc} */
@Override public GridQueryProperty property(String name) {
- GridQueryProperty res = props.get(name);
-
- if (res == null)
- res = uppercaseProps.get(name.toUpperCase());
-
- return res;
+ return getProperty(name);
}
/** {@inheritDoc} */
@@ -2365,7 +2315,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
@Override public <T> T value(String field, Object key, Object val) throws IgniteCheckedException {
assert field != null;
- GridQueryProperty prop = property(field);
+ GridQueryProperty prop = getProperty(field);
if (prop == null)
throw new IgniteCheckedException("Failed to find field '" + field + "' in type '" + name + "'.");
@@ -2379,7 +2329,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
throws IgniteCheckedException {
assert field != null;
- GridQueryProperty prop = property(field);
+ GridQueryProperty prop = getProperty(field);
if (prop == null)
throw new IgniteCheckedException("Failed to find field '" + field + "' in type '" + name + "'.");
@@ -2519,6 +2469,19 @@ public class GridQueryProcessor extends GridProcessorAdapter {
fields.put(name, prop.type());
}
+ /**
+ * @param field Property name.
+ * @return Property with given field name.
+ */
+ private GridQueryProperty getProperty(String field) {
+ GridQueryProperty res = props.get(field);
+
+ if (res == null)
+ res = uppercaseProps.get(field.toUpperCase());
+
+ return res;
+ }
+
/** {@inheritDoc} */
@Override public boolean valueTextIndex() {
return valTextIdx;
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
index fb4c037..5d74a2e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
@@ -22,7 +22,11 @@ import org.apache.ignite.IgniteCheckedException;
/**
* Description and access method for query entity field.
*/
-public interface GridQueryProperty {
+public abstract class GridQueryProperty {
+ /** */
+ public GridQueryProperty() {
+ }
+
/**
* Gets this property value from the given object.
*
@@ -31,7 +35,7 @@ public interface GridQueryProperty {
* @return Property value.
* @throws IgniteCheckedException If failed.
*/
- public Object value(Object key, Object val) throws IgniteCheckedException;
+ public abstract Object value(Object key, Object val) throws IgniteCheckedException;
/**
* Sets this property value for the given object.
@@ -41,26 +45,21 @@ public interface GridQueryProperty {
* @param propVal Property value.
* @throws IgniteCheckedException If failed.
*/
- public void setValue(Object key, Object val, Object propVal) throws IgniteCheckedException;
+ public abstract void setValue(Object key, Object val, Object propVal) throws IgniteCheckedException;
/**
* @return Property name.
*/
- public String name();
+ public abstract String name();
/**
* @return Class member type.
*/
- public Class<?> type();
+ public abstract Class<?> type();
/**
* Property ownership flag.
* @return {@code true} if this property belongs to key, {@code false} if it belongs to value.
*/
- public boolean key();
-
- /**
- * @return Parent property or {@code null} if this property is not nested.
- */
- public GridQueryProperty parent();
+ public abstract boolean key();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
index 7995083..4030758 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/DmlStatementsProcessor.java
@@ -59,6 +59,7 @@ import org.apache.ignite.internal.processors.query.GridQueryProperty;
import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
import org.apache.ignite.internal.processors.query.IgniteSQLException;
import org.apache.ignite.internal.processors.query.h2.dml.FastUpdateArguments;
+import org.apache.ignite.internal.processors.query.h2.dml.KeyValueSupplier;
import org.apache.ignite.internal.processors.query.h2.dml.UpdatePlan;
import org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
@@ -480,6 +481,7 @@ public class DmlStatementsProcessor {
while (it.hasNext()) {
List<?> e = it.next();
Object key = e.get(0);
+ Object val = (hasNewVal ? e.get(valColIdx) : e.get(1));
Object newVal;
@@ -498,6 +500,9 @@ public class DmlStatementsProcessor {
if (newVal == null)
throw new IgniteSQLException("New value for UPDATE must not be null", IgniteQueryErrorCode.NULL_VALUE);
+ if (bin && !(val instanceof BinaryObject))
+ val = cctx.grid().binary().toBinary(val);
+
// Skip key and value - that's why we start off with 2nd column
for (int i = 0; i < plan.tbl.getColumns().length - 2; i++) {
Column c = plan.tbl.getColumn(i + 2);
@@ -509,10 +514,13 @@ public class DmlStatementsProcessor {
boolean hasNewColVal = newColVals.containsKey(c.getName());
- if (!hasNewColVal)
+ // Binary objects get old field values from the Builder, so we can skip what we're not updating
+ if (bin && !hasNewColVal)
continue;
- Object colVal = newColVals.get(c.getName());
+ // Column values that have been explicitly specified have priority over field values in old or new _val
+ // If no value given for the column, then we expect to find it in value, and not in key - hence null arg.
+ Object colVal = hasNewColVal ? newColVals.get(c.getName()) : prop.value(null, val);
// UPDATE currently does not allow to modify key or its fields, so we must be safe to pass null as key.
desc.setColumnValue(null, newVal, colVal, i);
@@ -688,8 +696,8 @@ public class DmlStatementsProcessor {
// If we have just one item to put, just do so
if (plan.rowsNum == 1) {
- IgniteBiTuple t = rowToKeyValue(cctx, cursor.iterator().next(),
- plan);
+ IgniteBiTuple t = rowToKeyValue(cctx, cursor.iterator().next().toArray(), plan.colNames, plan.colTypes, plan.keySupplier,
+ plan.valSupplier, plan.keyColIdx, plan.valColIdx, desc);
cctx.cache().put(t.getKey(), t.getValue());
return 1;
@@ -701,7 +709,8 @@ public class DmlStatementsProcessor {
for (Iterator<List<?>> it = cursor.iterator(); it.hasNext();) {
List<?> row = it.next();
- IgniteBiTuple t = rowToKeyValue(cctx, row, plan);
+ IgniteBiTuple t = rowToKeyValue(cctx, row.toArray(), plan.colNames, plan.colTypes, plan.keySupplier, plan.valSupplier,
+ plan.keyColIdx, plan.valColIdx, desc);
rows.put(t.getKey(), t.getValue());
@@ -733,7 +742,8 @@ public class DmlStatementsProcessor {
// If we have just one item to put, just do so
if (plan.rowsNum == 1) {
- IgniteBiTuple t = rowToKeyValue(cctx, cursor.iterator().next(), plan);
+ IgniteBiTuple t = rowToKeyValue(cctx, cursor.iterator().next().toArray(), plan.colNames, plan.colTypes,
+ plan.keySupplier, plan.valSupplier, plan.keyColIdx, plan.valColIdx, desc);
if (cctx.cache().putIfAbsent(t.getKey(), t.getValue()))
return 1;
@@ -758,7 +768,8 @@ public class DmlStatementsProcessor {
while (it.hasNext()) {
List<?> row = it.next();
- final IgniteBiTuple t = rowToKeyValue(cctx, row, plan);
+ final IgniteBiTuple t = rowToKeyValue(cctx, row.toArray(), plan.colNames, plan.colTypes, plan.keySupplier,
+ plan.valSupplier, plan.keyColIdx, plan.valColIdx, desc);
rows.put(t.getKey(), new InsertEntryProcessor(t.getValue()));
@@ -826,14 +837,21 @@ public class DmlStatementsProcessor {
* Convert row presented as an array of Objects into key-value pair to be inserted to cache.
* @param cctx Cache context.
* @param row Row to process.
- * @param plan Update plan.
+ * @param cols Query cols.
+ * @param colTypes Column types to convert data from {@code row} to.
+ * @param keySupplier Key instantiation method.
+ * @param valSupplier Key instantiation method.
+ * @param keyColIdx Key column index, or {@code -1} if no key column is mentioned in {@code cols}.
+ * @param valColIdx Value column index, or {@code -1} if no value column is mentioned in {@code cols}.
+ * @param rowDesc Row descriptor.
* @throws IgniteCheckedException if failed.
*/
@SuppressWarnings({"unchecked", "ConstantConditions", "ResultOfMethodCallIgnored"})
- private IgniteBiTuple<?, ?> rowToKeyValue(GridCacheContext cctx, List<?> row, UpdatePlan plan)
- throws IgniteCheckedException {
- Object key = plan.keySupplier.apply(row);
- Object val = plan.valSupplier.apply(row);
+ private IgniteBiTuple<?, ?> rowToKeyValue(GridCacheContext cctx, Object[] row, String[] cols,
+ int[] colTypes, KeyValueSupplier keySupplier, KeyValueSupplier valSupplier, int keyColIdx, int valColIdx,
+ GridH2RowDescriptor rowDesc) throws IgniteCheckedException {
+ Object key = keySupplier.apply(F.asList(row));
+ Object val = valSupplier.apply(F.asList(row));
if (key == null)
throw new IgniteSQLException("Key for INSERT or MERGE must not be null", IgniteQueryErrorCode.NULL_KEY);
@@ -841,32 +859,13 @@ public class DmlStatementsProcessor {
if (val == null)
throw new IgniteSQLException("Value for INSERT or MERGE must not be null", IgniteQueryErrorCode.NULL_VALUE);
- GridQueryTypeDescriptor desc = plan.tbl.rowDescriptor().type();
-
- Map<String, Object> newColVals = new HashMap<>();
-
- for (int i = 0; i < plan.colNames.length; i++) {
- if (i == plan.keyColIdx || i == plan.valColIdx)
- continue;
-
- newColVals.put(plan.colNames[i], convert(row.get(i), plan.colNames[i],
- plan.tbl.rowDescriptor(), plan.colTypes[i]));
- }
-
- // We update columns in the order specified by the table for a reason - table's
- // column order preserves their precedence for correct update of nested properties.
- Column[] cols = plan.tbl.getColumns();
+ GridQueryTypeDescriptor desc = rowDesc.type();
- // First 2 columns are _key and _val, skip 'em.
- for (int i = 2; i < cols.length; i++) {
- String colName = cols[i].getName();
-
- if (!newColVals.containsKey(colName))
+ for (int i = 0; i < cols.length; i++) {
+ if (i == keyColIdx || i == valColIdx)
continue;
- Object colVal = newColVals.get(colName);
-
- desc.setValue(colName, key, val, colVal);
+ desc.setValue(cols[i], key, val, convert(row[i], cols[i], rowDesc, colTypes[i]));
}
if (cctx.binaryMarshaller()) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
index ce2971a..fdcd164 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/dml/UpdatePlanBuilder.java
@@ -48,7 +48,6 @@ import org.apache.ignite.internal.processors.query.h2.sql.GridSqlTable;
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlUnion;
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlUpdate;
import org.apache.ignite.internal.util.GridUnsafe;
-import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.h2.command.Prepared;
import org.h2.table.Column;
@@ -193,8 +192,8 @@ public final class UpdatePlanBuilder {
hasValProps = true;
}
- KeyValueSupplier keySupplier = createSupplier(cctx, desc.type(), keyColIdx, hasKeyProps, true, false);
- KeyValueSupplier valSupplier = createSupplier(cctx, desc.type(), valColIdx, hasValProps, false, false);
+ KeyValueSupplier keySupplier = createSupplier(cctx, desc.type(), keyColIdx, hasKeyProps, true);
+ KeyValueSupplier valSupplier = createSupplier(cctx, desc.type(), valColIdx, hasValProps, false);
if (stmt instanceof GridSqlMerge)
return UpdatePlan.forMerge(tbl.dataTable(), colNames, colTypes, keySupplier, valSupplier, keyColIdx,
@@ -254,6 +253,8 @@ public final class UpdatePlanBuilder {
GridSqlSelect sel;
if (stmt instanceof GridSqlUpdate) {
+ boolean bin = desc.context().binaryMarshaller();
+
List<GridSqlColumn> updatedCols = ((GridSqlUpdate) stmt).cols();
int valColIdx = -1;
@@ -281,10 +282,20 @@ public final class UpdatePlanBuilder {
if (hasNewVal)
valColIdx += 2;
- int newValColIdx = (hasNewVal ? valColIdx : 1);
+ int newValColIdx;
+
+ if (!hasProps) // No distinct properties, only whole new value - let's take it
+ newValColIdx = valColIdx;
+ else if (bin) // We update distinct columns in binary mode - let's choose correct index for the builder
+ newValColIdx = (hasNewVal ? valColIdx : 1);
+ else // Distinct properties, non binary mode - let's instantiate.
+ newValColIdx = -1;
- KeyValueSupplier newValSupplier = createSupplier(desc.context(), desc.type(), newValColIdx, hasProps,
- false, true);
+ // We want supplier to take present value only in case of binary mode as it will create
+ // whole new object as a result anyway, so we don't need to copy previous property values explicitly.
+ // Otherwise we always want it to instantiate new object whose properties we will later
+ // set to current values.
+ KeyValueSupplier newValSupplier = createSupplier(desc.context(), desc.type(), newValColIdx, hasProps, false);
sel = DmlAstUtils.selectForUpdate((GridSqlUpdate) stmt, errKeysPos);
@@ -308,11 +319,11 @@ public final class UpdatePlanBuilder {
* @param hasProps Whether column list affects individual properties of key or value.
* @param key Whether supplier should be created for key or for value.
* @return Closure returning key or value.
- * @throws IgniteCheckedException If failed.
+ * @throws IgniteCheckedException
*/
@SuppressWarnings({"ConstantConditions", "unchecked"})
private static KeyValueSupplier createSupplier(final GridCacheContext<?, ?> cctx, GridQueryTypeDescriptor desc,
- final int colIdx, boolean hasProps, final boolean key, boolean forUpdate) throws IgniteCheckedException {
+ final int colIdx, boolean hasProps, final boolean key) throws IgniteCheckedException {
final String typeName = key ? desc.keyTypeName() : desc.valueTypeName();
//Try to find class for the key locally.
@@ -321,10 +332,15 @@ public final class UpdatePlanBuilder {
boolean isSqlType = GridQueryProcessor.isSqlType(cls);
- // If we don't need to construct anything from scratch, just return value from given list.
- if (isSqlType || !hasProps) {
+ // If we don't need to construct anything from scratch, just return value from array.
+ if (isSqlType || !hasProps || !cctx.binaryMarshaller()) {
if (colIdx != -1)
- return new PlainValueSupplier(colIdx);
+ return new KeyValueSupplier() {
+ /** {@inheritDoc} */
+ @Override public Object apply(List<?> arg) throws IgniteCheckedException {
+ return arg.get(colIdx);
+ }
+ };
else if (isSqlType)
// Non constructable keys and values (SQL types) must be present in the query explicitly.
throw new IgniteCheckedException((key ? "Key" : "Value") + " is missing from query");
@@ -336,12 +352,7 @@ public final class UpdatePlanBuilder {
return new KeyValueSupplier() {
/** {@inheritDoc} */
@Override public Object apply(List<?> arg) throws IgniteCheckedException {
- Object obj = arg.get(colIdx);
-
- if (obj == null)
- return null;
-
- BinaryObject bin = cctx.grid().binary().toBinary(obj);
+ BinaryObject bin = cctx.grid().binary().toBinary(arg.get(colIdx));
return cctx.grid().binary().builder(bin);
}
@@ -358,26 +369,6 @@ public final class UpdatePlanBuilder {
}
}
else {
- if (colIdx != -1) {
- if (forUpdate && colIdx == 1) {
- // It's the case when the old value has to be taken as the basis for the new one on UPDATE,
- // so we have to clone it. And on UPDATE we don't expect any key supplier.
- assert !key;
-
- return new KeyValueSupplier() {
- /** {@inheritDoc} */
- @Override public Object apply(List<?> arg) throws IgniteCheckedException {
- byte[] oldPropBytes = cctx.marshaller().marshal(arg.get(1));
-
- // colVal is another object now, we can mutate it
- return cctx.marshaller().unmarshal(oldPropBytes, U.resolveClassLoader(cctx.gridConfig()));
- }
- };
- }
- else // We either are not updating, or the new value is given explicitly, no cloning needed.
- return new PlainValueSupplier(colIdx);
- }
-
Constructor<?> ctor;
try {
@@ -399,12 +390,8 @@ public final class UpdatePlanBuilder {
return ctor0.newInstance();
}
catch (Exception e) {
- if (S.INCLUDE_SENSITIVE)
- throw new IgniteCheckedException("Failed to instantiate " +
- (key ? "key" : "value") + " [type=" + typeName + ']', e);
- else
- throw new IgniteCheckedException("Failed to instantiate " +
- (key ? "key" : "value") + '.', e);
+ throw new IgniteCheckedException("Failed to invoke default ctor for " +
+ (key ? "key" : "value"), e);
}
}
};
@@ -418,12 +405,8 @@ public final class UpdatePlanBuilder {
return GridUnsafe.allocateInstance(cls);
}
catch (InstantiationException e) {
- if (S.INCLUDE_SENSITIVE)
- throw new IgniteCheckedException("Failed to instantiate " +
- (key ? "key" : "value") + " [type=" + typeName + ']', e);
- else
- throw new IgniteCheckedException("Failed to instantiate " +
- (key ? "key" : "value") + '.', e);
+ throw new IgniteCheckedException("Failed to invoke default ctor for " +
+ (key ? "key" : "value"), e);
}
}
};
@@ -431,6 +414,8 @@ public final class UpdatePlanBuilder {
}
}
+
+
/**
* @param target Expression to extract the table from.
* @return Back end table for this element.
@@ -498,26 +483,4 @@ public final class UpdatePlanBuilder {
return false;
}
-
- /**
- * Simple supplier that just takes specified element of a given row.
- */
- private final static class PlainValueSupplier implements KeyValueSupplier {
- /** Index of column to use. */
- private final int colIdx;
-
- /**
- * Constructor.
- *
- * @param colIdx Column index.
- */
- private PlainValueSupplier(int colIdx) {
- this.colIdx = colIdx;
- }
-
- /** {@inheritDoc} */
- @Override public Object apply(List<?> arg) throws IgniteCheckedException {
- return arg.get(colIdx);
- }
- }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
index 626846b..86d01c7 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
@@ -46,8 +46,6 @@ import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import org.apache.ignite.testframework.junits.IgniteTestResources;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import static org.apache.ignite.internal.processors.cache.IgniteCacheUpdateSqlQuerySelfTest.AllTypes;
-
/**
*
*/
@@ -128,8 +126,6 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
createCaches();
else
createBinaryCaches();
-
- ignite(0).createCache(cacheConfig("I2AT", true, false, Integer.class, AllTypes.class));
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
index 3c92fdf..649012f 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
@@ -65,7 +65,7 @@ public abstract class IgniteCacheAbstractSqlDmlQuerySelfTest extends GridCommonA
/**
* @return whether {@link #marsh} is an instance of {@link BinaryMarshaller} or not.
*/
- protected boolean isBinaryMarshaller() {
+ private boolean isBinaryMarshaller() {
return marsh instanceof BinaryMarshaller;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
index f91f405..e9c21dc 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
@@ -17,8 +17,6 @@
package org.apache.ignite.internal.processors.cache;
-import java.util.ArrayList;
-import java.util.Arrays;
import java.util.concurrent.Callable;
import javax.cache.CacheException;
import org.apache.ignite.IgniteCache;
@@ -204,24 +202,4 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
assertEquals(createPerson(2, "Alex"), p.get(new Key4(2)));
}
-
- /**
- *
- */
- public void testNestedFieldsHandling() {
- IgniteCache<Integer, IgniteCacheUpdateSqlQuerySelfTest.AllTypes> p = ignite(0).cache("I2AT");
-
- p.query(new SqlFieldsQuery("insert into AllTypes(_key, innerTypeCol, arrListCol, _val, innerStrCol) " +
- "values (1, ?, ?, ?, 'sss')") .setArgs(new IgniteCacheUpdateSqlQuerySelfTest.AllTypes.InnerType(50L),
- new ArrayList<>(Arrays.asList(3L, 2L, 1L)), new IgniteCacheUpdateSqlQuerySelfTest.AllTypes(1L)));
-
- IgniteCacheUpdateSqlQuerySelfTest.AllTypes res = p.get(1);
-
- IgniteCacheUpdateSqlQuerySelfTest.AllTypes.InnerType resInner = new IgniteCacheUpdateSqlQuerySelfTest.AllTypes.InnerType(50L);
-
- resInner.innerStrCol = "sss";
- resInner.arrListCol = new ArrayList<>(Arrays.asList(3L, 2L, 1L));
-
- assertEquals(resInner, res.innerTypeCol);
- }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
index d9a2d9e..32b7a12 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
@@ -17,13 +17,9 @@
package org.apache.ignite.internal.processors.cache;
-import java.util.ArrayList;
-import java.util.Arrays;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.query.SqlFieldsQuery;
-import static org.apache.ignite.internal.processors.cache.IgniteCacheUpdateSqlQuerySelfTest.AllTypes;
-
/**
*
*/
@@ -153,24 +149,4 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
assertEquals(createPerson(2, "Alex"), p.get(new Key4(2)));
}
-
- /**
- *
- */
- public void testNestedFieldsHandling() {
- IgniteCache<Integer, AllTypes> p = ignite(0).cache("I2AT");
-
- p.query(new SqlFieldsQuery("merge into AllTypes(_key, innerTypeCol, arrListCol, _val, innerStrCol) " +
- "values (1, ?, ?, ?, 'sss')") .setArgs(new AllTypes.InnerType(50L),
- new ArrayList<>(Arrays.asList(3L, 2L, 1L)), new AllTypes(1L)));
-
- AllTypes res = p.get(1);
-
- AllTypes.InnerType resInner = new AllTypes.InnerType(50L);
-
- resInner.innerStrCol = "sss";
- resInner.arrListCol = new ArrayList<>(Arrays.asList(3L, 2L, 1L));
-
- assertEquals(resInner, res.innerTypeCol);
- }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
index c3d9d8e..575f617 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
@@ -44,12 +44,6 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
ignite(0).createCache(createAllTypesCacheConfig());
}
- /** {@inheritDoc} */
- @Override protected void beforeTest() throws Exception {
- super.beforeTest();
- ignite(0).cache("L2AT").clear();
- }
-
/**
*
*/
@@ -188,19 +182,17 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
cache.query(new SqlFieldsQuery("insert into \"AllTypes\"(_key, _val, \"dateCol\", \"booleanCol\"," +
"\"tsCol\") values(2, ?, '2016-11-30 12:00:00', false, DATE '2016-12-01')").setArgs(new AllTypes(2L)));
- // Look ma, no hands: first we set value of inner object column (innerTypeCol), then update only one of its
- // fields (innerLongCol), while leaving another inner property (innerStrCol) as specified by innerTypeCol.
- cache.query(new SqlFieldsQuery("update \"AllTypes\" set \"innerLongCol\" = ?, \"doubleCol\" = CAST('50' as INT)," +
+ cache.query(new SqlFieldsQuery("select \"primitiveIntsCol\" from \"AllTypes\"")).getAll();
+
+ cache.query(new SqlFieldsQuery("update \"AllTypes\" set \"doubleCol\" = CAST('50' as INT)," +
" \"booleanCol\" = 80, \"innerTypeCol\" = ?, \"strCol\" = PI(), \"shortCol\" = " +
"CAST(WEEK(PARSEDATETIME('2016-11-30', 'yyyy-MM-dd')) as VARCHAR), " +
"\"sqlDateCol\"=TIMESTAMP '2016-12-02 13:47:00', \"tsCol\"=TIMESTAMPADD('MI', 2, " +
"DATEADD('DAY', 2, \"tsCol\")), \"primitiveIntsCol\" = ?, \"bytesCol\" = ?")
- .setArgs(5, new AllTypes.InnerType(80L), new int[] {2, 3}, new Byte[] {4, 5, 6}));
+ .setArgs(new AllTypes.InnerType(80L), new int[] {2, 3}, new Byte[] {4, 5, 6}));
AllTypes res = (AllTypes) cache.get(2L);
- assertNotNull(res);
-
assertEquals(new BigDecimal(301.0).doubleValue(), res.bigDecimalCol.doubleValue());
assertEquals(50.0, res.doubleCol);
assertEquals(2L, (long) res.longCol);
@@ -210,11 +202,7 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
assertTrue(Arrays.equals(new Byte[] {4, 5, 6}, res.bytesCol));
assertTrue(Arrays.deepEquals(new Integer[] {0, 1}, res.intsCol));
assertTrue(Arrays.equals(new int[] {2, 3}, res.primitiveIntsCol));
-
- AllTypes.InnerType expInnerType = new AllTypes.InnerType(80L);
- expInnerType.innerLongCol = 5L;
-
- assertEquals(expInnerType, res.innerTypeCol);
+ assertEquals(new AllTypes.InnerType(80L), res.innerTypeCol);
assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse("2016-11-30 12:00:00"), res.dateCol);
assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse("2016-12-03 00:02:00"), res.tsCol);
assertEquals(2, res.intCol);
@@ -225,45 +213,6 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
assertEquals(49, res.shortCol);
}
- /** */
- public void testSingleInnerFieldUpdate() throws ParseException {
- IgniteCache cache = ignite(0).cache("L2AT");
-
- cache.query(new SqlFieldsQuery("insert into \"AllTypes\"(_key, _val, \"dateCol\", \"booleanCol\") values(2, ?," +
- "'2016-11-30 12:00:00', false)").setArgs(new AllTypes(2L)));
-
- assertFalse(cache.query(new SqlFieldsQuery("select * from \"AllTypes\"")).getAll().isEmpty());
-
- cache.query(new SqlFieldsQuery("update \"AllTypes\" set \"innerLongCol\" = 5"));
-
- AllTypes res = (AllTypes) cache.get(2L);
-
- assertNotNull(res);
-
- assertEquals(new BigDecimal(301.0).doubleValue(), res.bigDecimalCol.doubleValue());
- assertEquals(3.01, res.doubleCol);
- assertEquals(2L, (long) res.longCol);
- assertFalse(res.booleanCol);
-
- assertEquals("2", res.strCol);
- assertTrue(Arrays.equals(new byte[] {0, 1}, res.primitiveBytesCol));
- assertTrue(Arrays.deepEquals(new Byte[] {0, 1}, res.bytesCol));
- assertTrue(Arrays.deepEquals(new Integer[] {0, 1}, res.intsCol));
- assertTrue(Arrays.equals(new int[] {0, 1}, res.primitiveIntsCol));
-
- AllTypes.InnerType expInnerType = new AllTypes.InnerType(2L);
- expInnerType.innerLongCol = 5L;
-
- assertEquals(expInnerType, res.innerTypeCol);
- assertEquals(new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse("2016-11-30 12:00:00"), res.dateCol);
- assertNull(res.tsCol);
- assertEquals(2, res.intCol);
- assertEquals(AllTypes.EnumType.ENUMTRUE, res.enumCol);
- assertNull(res.sqlDateCol);
-
- assertEquals(-23000, res.shortCol);
- }
-
/**
*
*/
@@ -359,7 +308,7 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
InnerType innerTypeCol;
/** */
- static class InnerType implements Serializable {
+ static final class InnerType implements Serializable {
/** */
@QuerySqlField
Long innerLongCol;
http://git-wip-us.apache.org/repos/asf/ignite/blob/bb1ac0a5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index 69285f1..e412828 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
@@ -578,11 +578,6 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
@Override public boolean key() {
return false;
}
-
- /** */
- @Override public GridQueryProperty parent() {
- return null;
- }
};
}