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 <[email protected]> Authored: Mon Feb 8 18:51:42 2016 +0300 Committer: sboikov <[email protected]> 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(); }
