You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/02/08 16:51:55 UTC
ignite git commit: sql-store Compare values without unmarshalling.
Repository: ignite
Updated Branches:
refs/heads/sql-store-cmp 0707e3843 -> db664f038
sql-store Compare values without unmarshalling.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/db664f03
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/db664f03
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/db664f03
Branch: refs/heads/sql-store-cmp
Commit: db664f038d5ff1115794e1918613af83efb58352
Parents: 0707e38
Author: sboikov <sb...@gridgain.com>
Authored: Mon Feb 8 18:51:42 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Feb 8 18:51:42 2016 +0300
----------------------------------------------------------------------
.../org/apache/ignite/binary/BinaryField.java | 10 ++-
.../ignite/internal/binary/BinaryFieldImpl.java | 23 ++++---
.../internal/binary/BinaryObjectExImpl.java | 12 +++-
.../internal/binary/BinaryObjectImpl.java | 34 +++++-----
.../binary/BinaryObjectOffheapImpl.java | 34 ++++++----
.../processors/query/GridQueryProcessor.java | 65 +++++++++++++++++---
.../processors/query/GridQueryProperty.java | 15 ++++-
.../h2/GridIndexingSpiAbstractSelfTest.java | 6 +-
8 files changed, 150 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java b/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
index b85caed..3094b85 100644
--- a/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
+++ b/modules/core/src/main/java/org/apache/ignite/binary/BinaryField.java
@@ -47,7 +47,13 @@ public interface BinaryField {
/**
* @param addr Marshalled object address.
* @param len Marshalled data length.
- * @return Field address.
+ * @return Field offset.
*/
- public long fieldAddress(long addr, int len);
+ public int fieldOffset(long addr, int len);
+
+ /**
+ * @param obj Object.
+ * @return Field offset.
+ */
+ public int fieldOffset(BinaryObject obj);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
index abbc42f..e8587f3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryFieldImpl.java
@@ -105,7 +105,16 @@ public class BinaryFieldImpl implements BinaryFieldEx {
}
/** {@inheritDoc} */
- @Override public long fieldAddress(long addr, int len) {
+ @Override public int fieldOffset(BinaryObject obj) {
+ BinaryObjectExImpl obj0 = (BinaryObjectExImpl)obj;
+
+ int order = fieldOrder(obj0);
+
+ return order != BinarySchema.ORDER_NOT_FOUND ? obj0.fieldOffsetByOrder(order) : -1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int fieldOffset(long addr, int len) {
int typeId = GridUnsafe.getInt(addr + GridBinaryMarshaller.TYPE_ID_POS);
if (typeId != this.typeId) {
@@ -133,7 +142,7 @@ public class BinaryFieldImpl implements BinaryFieldEx {
int order = schema.order(fieldId);
if (order == BinarySchema.ORDER_NOT_FOUND)
- return -1L;
+ return -1;
int schemaOff = BinaryPrimitives.readInt(addr, GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
@@ -144,16 +153,16 @@ public class BinaryFieldImpl implements BinaryFieldEx {
int fieldOffPos = schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
- int fieldPos;
+ int fieldOff;
if (fieldOffLen == BinaryUtils.OFFSET_1)
- fieldPos = ((int)BinaryPrimitives.readByte(addr, fieldOffPos) & 0xFF);
+ fieldOff = ((int)BinaryPrimitives.readByte(addr, fieldOffPos) & 0xFF);
else if (fieldOffLen == BinaryUtils.OFFSET_2)
- fieldPos = ((int)BinaryPrimitives.readShort(addr, fieldOffPos) & 0xFFFF);
+ fieldOff = ((int)BinaryPrimitives.readShort(addr, fieldOffPos) & 0xFFFF);
else
- fieldPos = BinaryPrimitives.readInt(addr, fieldOffPos);
+ fieldOff = BinaryPrimitives.readInt(addr, fieldOffPos);
- return addr + fieldPos;
+ return fieldOff;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
index 4ea5935..c80ed9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectExImpl.java
@@ -75,12 +75,18 @@ public abstract class BinaryObjectExImpl implements BinaryObjectEx {
}
/**
- * Get field by offset.
+ * @param order Field order.
+ * @return Field offset.
+ */
+ protected abstract int fieldOffsetByOrder(int order);
+
+ /**
+ * Get field by order.
*
- * @param fieldOffset Field offset.
+ * @param order Field order.
* @return Field value.
*/
- @Nullable protected abstract <F> F fieldByOrder(int fieldOffset);
+ @Nullable protected abstract <F> F fieldByOrder(int order);
/**
* Writes field value defined by the given field offset to the given byte buffer.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
index 1afbeb9..8512b8f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
@@ -265,28 +265,34 @@ public final class BinaryObjectImpl extends BinaryObjectExImpl implements Extern
}
/** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Nullable @Override protected <F> F fieldByOrder(int order) {
- Object val;
-
- // Calculate field position.
- int schemaOffset = BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+ @Override protected int fieldOffsetByOrder(int order) {
+ int schemaOff = BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS);
int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN;
- int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+ int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
- int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen;
+ int fieldOffPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
- int fieldPos;
+ int fieldOff;
- if (fieldOffsetLen == BinaryUtils.OFFSET_1)
- fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF);
- else if (fieldOffsetLen == BinaryUtils.OFFSET_2)
- fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF);
+ if (fieldOffLen == BinaryUtils.OFFSET_1)
+ fieldOff = ((int)BinaryPrimitives.readByte(arr, fieldOffPos) & 0xFF);
+ else if (fieldOffLen == BinaryUtils.OFFSET_2)
+ fieldOff = ((int)BinaryPrimitives.readShort(arr, fieldOffPos) & 0xFFFF);
else
- fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos);
+ fieldOff = BinaryPrimitives.readInt(arr, fieldOffPos);
+
+ return fieldOff;
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Nullable @Override protected <F> F fieldByOrder(int order) {
+ Object val;
+
+ int fieldPos = start + fieldOffsetByOrder(order);
// Read header and try performing fast lookup for well-known types (the most common types go first).
byte hdr = BinaryPrimitives.readByte(arr, fieldPos);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
index c93e5d8..f892921 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
@@ -124,6 +124,7 @@ public class BinaryObjectOffheapImpl extends BinaryObjectExImpl implements Exter
return null;
}
+ /** {@inheritDoc} */
@Override public boolean putValue(ByteBuffer buf, CacheObjectContext ctx) throws IgniteCheckedException {
throw new UnsupportedOperationException("TODO implement");
}
@@ -164,28 +165,35 @@ public class BinaryObjectOffheapImpl extends BinaryObjectExImpl implements Exter
}
/** {@inheritDoc} */
- @SuppressWarnings("unchecked")
- @Nullable @Override protected <F> F fieldByOrder(int order) {
- Object val;
-
+ @Override protected int fieldOffsetByOrder(int order) {
// Calculate field position.
- int schemaOffset = BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+ int schemaOff = BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS);
int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN;
- int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+ int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
- int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen;
+ int fieldOffPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen;
- int fieldPos;
+ int fieldOff;
- if (fieldOffsetLen == BinaryUtils.OFFSET_1)
- fieldPos = start + ((int)BinaryPrimitives.readByte(ptr, fieldOffsetPos) & 0xFF);
- else if (fieldOffsetLen == BinaryUtils.OFFSET_2)
- fieldPos = start + ((int)BinaryPrimitives.readShort(ptr, fieldOffsetPos) & 0xFFFF);
+ if (fieldOffLen == BinaryUtils.OFFSET_1)
+ fieldOff = ((int)BinaryPrimitives.readByte(ptr, fieldOffPos) & 0xFF);
+ else if (fieldOffLen == BinaryUtils.OFFSET_2)
+ fieldOff = ((int)BinaryPrimitives.readShort(ptr, fieldOffPos) & 0xFFFF);
else
- fieldPos = start + BinaryPrimitives.readInt(ptr, fieldOffsetPos);
+ fieldOff = BinaryPrimitives.readInt(ptr, fieldOffPos);
+
+ return fieldOff;
+ }
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Nullable @Override protected <F> F fieldByOrder(int order) {
+ Object val;
+
+ int fieldPos = start + fieldOffsetByOrder(order);
// Read header and try performing fast lookup for well-known types (the most common types go first).
byte hdr = BinaryPrimitives.readByte(ptr, fieldPos);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/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 e6461f7..5c40e4c 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
@@ -1886,13 +1886,18 @@ public class GridQueryProcessor extends GridProcessorAdapter {
}
/** {@inheritDoc} */
- @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) {
+ @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
throw new UnsupportedOperationException();
}
/** {@inheritDoc} */
@Override public boolean keyProperty() {
- return false;
+ return key;
}
/** {@inheritDoc} */
@@ -2020,7 +2025,53 @@ public class GridQueryProcessor extends GridProcessorAdapter {
}
/** {@inheritDoc} */
- @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException {
+ @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
+ if (parent != null)
+ return parent.propertyOffset(key, val);
+
+ if (binaryCtx == null)
+ throw new UnsupportedOperationException("BinaryObjects are not enabled.");
+
+ Object obj;
+
+ int isKeyProp0 = isKeyProp;
+
+ if (isKeyProp0 == 0) {
+ // Key is allowed to be a non-binary object here.
+ // We check key before value consistently with ClassProperty.
+ if (key instanceof BinaryObject && ((BinaryObject)key).hasField(propName))
+ isKeyProp = isKeyProp0 = 1;
+ else if (val instanceof BinaryObject && ((BinaryObject)val).hasField(propName))
+ isKeyProp = isKeyProp0 = -1;
+ else {
+ U.warn(log, "Neither key nor value have property " +
+ "[propName=" + propName + ", key=" + key + ", val=" + val + "]");
+
+ return -1;
+ }
+ }
+
+ obj = isKeyProp0 == 1 ? key : val;
+
+ assert obj instanceof BinaryObject : obj;
+
+ BinaryObject obj0 = (BinaryObject)obj;
+
+ BinaryField field = binaryField(obj0);
+
+ if (field != null)
+ return field.fieldOffset(obj0);
+
+ // TODO: try to get address from object.
+
+ return -1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException {
+ if (parent != null)
+ return parent.propertyOffset(keyAddr, keyLen, valAddr, valLen);
+
if (binaryCtx == null)
throw new UnsupportedOperationException("BinaryObjects are not enabled.");
@@ -2036,7 +2087,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
else {
U.warn(log, "Neither key nor value have property [propName=" + propName + "]");
- return -1L;
+ return -1;
}
}
@@ -2055,11 +2106,11 @@ public class GridQueryProcessor extends GridProcessorAdapter {
BinaryField field = binaryField(addr);
if (field != null)
- return field.fieldAddress(addr, len);
+ return field.fieldOffset(addr, len);
- // TODO: try to get address from object.
+ // TODO: try to get offset from object.
- return -1L;
+ return -1;
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/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 6e600a1..0accb5d 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
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.processors.query;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.processors.cache.CacheObject;
/**
* Description and access method for query entity field.
@@ -45,11 +46,21 @@ public abstract class GridQueryProperty {
/**
* @param keyAddr Marshaled key address.
+ * @param keyLen Marshaled key length.
* @param valAddr Marshalled value address.
- * @return Value address of -1 if property not found.
+ * @param valLen Marshalled value length.
+ * @return Value address or -1 if property not found.
* @throws IgniteCheckedException If failed.
*/
- public abstract long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException;
+ public abstract int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) throws IgniteCheckedException;
+
+ /**
+ * @param key Key.
+ * @param val Value.
+ * @return Property offset or -1 if property not found.
+ * @throws IgniteCheckedException If failed.
+ */
+ public abstract int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException;
/**
* @return {@code True} if property belongs to cache key.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db664f03/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 0040cb6..f014f54 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
@@ -522,7 +522,11 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
return Object.class;
}
- @Override public long valueAddress(long keyAddr, int keyLen, long valAddr, int valLen) {
+ @Override public int propertyOffset(long keyAddr, int keyLen, long valAddr, int valLen) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override public int propertyOffset(CacheObject key, CacheObject val) throws IgniteCheckedException {
throw new UnsupportedOperationException();
}