ignite-950: test fixes, refactoring
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/d9f85e69 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/d9f85e69 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/d9f85e69 Branch: refs/heads/ignite-950 Commit: d9f85e69aee657b3fb976ccb757c714efe78c106 Parents: a088170 Author: Denis Magda <dma...@gridgain.com> Authored: Tue Jun 23 10:46:24 2015 +0300 Committer: Denis Magda <dma...@gridgain.com> Committed: Tue Jun 23 10:46:24 2015 +0300 ---------------------------------------------------------------------- .../ignite/codegen/MessageCodeGenerator.java | 2 +- .../communication/GridIoMessageFactory.java | 4 +- .../cache/CacheIndexedObjectImpl.java | 364 +++++++++++++++++++ .../processors/cache/CacheObjectContext.java | 12 +- .../cache/CacheOptimizedObjectImpl.java | 364 ------------------- .../cache/KeyCacheIndexedObjectImpl.java | 104 ++++++ .../cache/KeyCacheOptimizedObjectImpl.java | 104 ------ .../IgniteCacheObjectProcessorImpl.java | 42 +-- .../processors/query/GridQueryProcessor.java | 119 ++---- .../optimized/OptimizedMarshallerUtils.java | 2 +- .../ext/OptimizedObjectInputStreamExt.java | 2 +- .../ext/OptimizedMarshallerExtSelfTest.java | 56 ++- 12 files changed, 586 insertions(+), 589 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java ---------------------------------------------------------------------- diff --git a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java index 4780ee4..e71e628 100644 --- a/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java +++ b/modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java @@ -143,7 +143,7 @@ public class MessageCodeGenerator { MessageCodeGenerator gen = new MessageCodeGenerator(srcDir); - gen.generateAndWrite(CacheOptimizedObjectImpl.class); + gen.generateAndWrite(CacheIndexedObjectImpl.class); // gen.generateAndWrite(GridDistributedLockRequest.class); // gen.generateAndWrite(GridDistributedLockResponse.class); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java index 4c8fec5..29e778d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java @@ -601,12 +601,12 @@ public class GridIoMessageFactory implements MessageFactory { break; case 113: - msg = new CacheOptimizedObjectImpl(); + msg = new CacheIndexedObjectImpl(); break; case 114: - msg = new KeyCacheOptimizedObjectImpl(); + msg = new KeyCacheIndexedObjectImpl(); // [-3..114] - this // [120..123] - DR http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheIndexedObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheIndexedObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheIndexedObjectImpl.java new file mode 100644 index 0000000..58e9c97 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheIndexedObjectImpl.java @@ -0,0 +1,364 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import org.apache.ignite.*; +import org.apache.ignite.internal.util.*; +import org.apache.ignite.internal.util.typedef.internal.*; +import org.apache.ignite.marshaller.optimized.ext.*; +import org.apache.ignite.plugin.extensions.communication.*; +import org.jetbrains.annotations.*; +import sun.misc.*; + +import java.io.*; +import java.nio.*; + +/** + * Cache object implementation for classes that support footer injection is their serialized form thus enabling fields + * search and extraction without necessity to fully deserialize an object. + */ +public class CacheIndexedObjectImpl extends CacheObjectAdapter { + /** */ + private static final long serialVersionUID = 0L; + + /** */ + private static final Unsafe UNSAFE = GridUnsafe.unsafe(); + + /** */ + private static final long BYTE_ARR_OFF = UNSAFE.arrayBaseOffset(byte[].class); + + /** */ + protected int start; + + /** */ + protected int len; + + /** + * For {@link Externalizable}. + */ + public CacheIndexedObjectImpl() { + // No-op + } + + /** + * Instantiates {@code CacheIndexedObjectImpl} with object. + * @param val Object. + */ + public CacheIndexedObjectImpl(Object val) { + this(val, null, 0, 0); + } + + /** + * Instantiates {@code CacheIndexedObjectImpl} with object's serialized form. + * @param valBytes Object serialized to byte array. + * @param start Object's start in the array. + * @param len Object's len in the array. + */ + public CacheIndexedObjectImpl(byte[] valBytes, int start, int len) { + this(null, valBytes, start, len); + } + + /** + * Instantiates {@code CacheIndexedObjectImpl} with object's serialized form and value. + * @param val Object. + * @param valBytes Object serialized to byte array. + */ + public CacheIndexedObjectImpl(Object val, byte[] valBytes) { + this(val, valBytes, 0, valBytes != null ? valBytes.length : 0); + } + + /** + * Instantiates {@code CacheIndexedObjectImpl}. + * @param val Object. + * @param valBytes Object in a serialized form. + * @param start Object's start in the array. + * @param len Object's len in the array. + */ + public CacheIndexedObjectImpl(Object val, byte[] valBytes, int start, int len) { + assert val != null || (valBytes != null && start >= 0 && len > 0); + + this.val = val; + this.valBytes = valBytes; + this.start = start; + this.len = len; + } + + /** {@inheritDoc} */ + @Nullable @Override public <T> T value(CacheObjectContext ctx, boolean cpy) { + return (T)this; + } + + /** {@inheritDoc} */ + @Override public byte[] valueBytes(CacheObjectContext ctx) throws IgniteCheckedException { + toMarshaledFormIfNeeded(ctx); + + if (detached()) + return valBytes; + + byte[] arr = new byte[len]; + + U.arrayCopy(valBytes, start, arr, 0, len); + + return arr; + } + + /** {@inheritDoc} */ + @Override public CacheObject prepareForCache(CacheObjectContext ctx) { + if (detached()) + return this; + + return detach(); + } + + /** {@inheritDoc} */ + @Override public void finishUnmarshal(CacheObjectContext ctx, ClassLoader ldr) throws IgniteCheckedException { + assert val != null || valBytes != null; + + if (val == null && ctx.storeValue()) + val = ctx.processor().unmarshal(ctx, valBytes, start, len, ldr); + } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(CacheObjectContext ctx) throws IgniteCheckedException { + assert val != null || valBytes != null; + + toMarshaledFormIfNeeded(ctx); + } + + /** {@inheritDoc} */ + @Override public byte directType() { + // refer to GridIoMessageFactory. + return 113; + } + + /** {@inheritDoc} */ + @Override public byte type() { + return TYPE_OPTIMIZED; + } + + /** + * Returns object's type ID. + * + * @return Type ID. + */ + public int typeId() { + assert valBytes != null; + + int typeId = UNSAFE.getInt(valBytes, BYTE_ARR_OFF + start + 1); + + if (typeId == 0) + throw new IgniteException("Object's type ID wasn't written to cache."); + + return typeId; + } + + /** + * Checks whether a wrapped object has field with name {@code fieldName}. + * + * @param fieldName Field name. + * @param marsh Marshaller. + * @return {@code true} if has. + * @throws IgniteCheckedException In case of error. + */ + public boolean hasField(String fieldName, OptimizedMarshallerExt marsh) throws IgniteCheckedException { + assert valBytes != null; + + return marsh.hasField(fieldName, valBytes, start, len); + } + + /** + * Searches and returns field if it exists. + * + * @param fieldName Field name. + * @param marsh Marshaller. + * @return Field. + * @throws IgniteCheckedException In case of error. + */ + public Object field(String fieldName, OptimizedMarshallerExt marsh) throws IgniteCheckedException { + assert valBytes != null; + + return marsh.readField(fieldName, valBytes, start, len, val != null ? val.getClass().getClassLoader() : null); + } + + /** + * Deserializes wrapped object. + * + * @param ctx Cache context. + * @return Deserialized object. + */ + public Object deserialize(CacheObjectContext ctx) { + if (val != null) + return val; + + try { + assert valBytes != null; + + Object val = ctx.processor().unmarshal(ctx, valBytes, start, len, + ctx.kernalContext().config().getClassLoader()); + + if (ctx.storeValue()) + this.val = val; + + return val; + } + catch (IgniteCheckedException e) { + throw new IgniteException("Failed to unmarshall object.", e); + } + } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + + out.writeInt(start); + out.writeInt(len); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + + start = in.readInt(); + len = in.readInt(); + } + + /** {@inheritDoc} */ + @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) { + reader.setBuffer(buf); + + if (!reader.beforeMessageRead()) + return false; + + if (!super.readFrom(buf, reader)) + return false; + + switch (reader.state()) { + case 1: + len = reader.readInt("len"); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); + + case 2: + start = reader.readInt("start"); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); + + } + + return true; + } + + /** {@inheritDoc} */ + @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) { + writer.setBuffer(buf); + + if (!super.writeTo(buf, writer)) + return false; + + if (!writer.isHeaderWritten()) { + if (!writer.writeHeader(directType(), fieldsCount())) + return false; + + writer.onHeaderWritten(); + } + + switch (writer.state()) { + case 1: + if (!writer.writeInt("len", len)) + return false; + + writer.incrementState(); + + case 2: + if (!writer.writeInt("start", start)) + return false; + + writer.incrementState(); + + } + + return true; + } + + /** {@inheritDoc} */ + @Override public byte fieldsCount() { + return 3; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + assert false; + + return super.hashCode(); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object obj) { + assert false; + + return super.equals(obj); + } + + /** + * Detaches object. + * + * @return Detached object wrapped by {@code CacheIndexedObjectImpl}. + */ + protected CacheIndexedObjectImpl detach() { + if (detached()) + return this; + + byte[] arr = new byte[len]; + + U.arrayCopy(valBytes, start, arr, 0, len); + + return new CacheIndexedObjectImpl(arr, 0, len); + } + + /** + * Checks whether the object is already detached or not. + * + * @return {@code true} if detached. + */ + protected boolean detached() { + return start == 0 && len == valBytes.length; + } + + /** + * Marshals {@link #val} to {@link #valBytes} if needed. + * + * @param ctx Cache object context. + * @throws IgniteCheckedException In case of error. + */ + protected void toMarshaledFormIfNeeded(CacheObjectContext ctx) throws IgniteCheckedException { + if (valBytes == null) { + assert val != null; + + valBytes = ctx.processor().marshal(ctx, val); + + start = 0; + len = valBytes.length; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java index bf2cc07..4e5ca5f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectContext.java @@ -157,8 +157,8 @@ public class CacheObjectContext { * @return Unwrapped object. */ private Object unwrapObject(Object obj) { - if (obj instanceof CacheOptimizedObjectImpl) - return ((CacheOptimizedObjectImpl)obj).deserialize(this); + if (obj instanceof CacheIndexedObjectImpl) + return ((CacheIndexedObjectImpl)obj).deserialize(this); else if (obj instanceof Map.Entry) { Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>)obj; @@ -166,16 +166,16 @@ public class CacheObjectContext { boolean unwrapped = false; - if (key instanceof CacheOptimizedObjectImpl) { - key = ((CacheOptimizedObjectImpl)key).deserialize(this); + if (key instanceof CacheIndexedObjectImpl) { + key = ((CacheIndexedObjectImpl)key).deserialize(this); unwrapped = true; } Object val = entry.getValue(); - if (val instanceof CacheOptimizedObjectImpl) { - val = ((CacheOptimizedObjectImpl)val).deserialize(this); + if (val instanceof CacheIndexedObjectImpl) { + val = ((CacheIndexedObjectImpl)val).deserialize(this); unwrapped = true; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOptimizedObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOptimizedObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOptimizedObjectImpl.java deleted file mode 100644 index f07344c..0000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOptimizedObjectImpl.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.processors.cache; - -import org.apache.ignite.*; -import org.apache.ignite.internal.util.*; -import org.apache.ignite.internal.util.typedef.internal.*; -import org.apache.ignite.marshaller.optimized.ext.*; -import org.apache.ignite.plugin.extensions.communication.*; -import org.jetbrains.annotations.*; -import sun.misc.*; - -import java.io.*; -import java.nio.*; - -/** - * Cache object implementation for classes that support footer injection is their serialized form thus enabling fields - * search and extraction without necessity to fully deserialize an object. - */ -public class CacheOptimizedObjectImpl extends CacheObjectAdapter { - /** */ - private static final long serialVersionUID = 0L; - - /** */ - private static final Unsafe UNSAFE = GridUnsafe.unsafe(); - - /** */ - private static final long BYTE_ARR_OFF = UNSAFE.arrayBaseOffset(byte[].class); - - /** */ - protected int start; - - /** */ - protected int len; - - /** - * For {@link Externalizable}. - */ - public CacheOptimizedObjectImpl() { - // No-op - } - - /** - * Instantiates {@code CacheOptimizedObjectImpl} with object. - * @param val Object. - */ - public CacheOptimizedObjectImpl(Object val) { - this(val, null, 0, 0); - } - - /** - * Instantiates {@code CacheOptimizedObjectImpl} with object's serialized form. - * @param valBytes Object serialized to byte array. - * @param start Object's start in the array. - * @param len Object's len in the array. - */ - public CacheOptimizedObjectImpl(byte[] valBytes, int start, int len) { - this(null, valBytes, start, len); - } - - /** - * Instantiates {@code CacheOptimizedObjectImpl} with object's serialized form and value. - * @param val Object. - * @param valBytes Object serialized to byte array. - */ - public CacheOptimizedObjectImpl(Object val, byte[] valBytes) { - this(val, valBytes, 0, valBytes != null ? valBytes.length : 0); - } - - /** - * Instantiates {@code CacheOptimizedObjectImpl}. - * @param val Object. - * @param valBytes Object in a serialized form. - * @param start Object's start in the array. - * @param len Object's len in the array. - */ - public CacheOptimizedObjectImpl(Object val, byte[] valBytes, int start, int len) { - assert val != null || (valBytes != null && start >= 0 && len > 0); - - this.val = val; - this.valBytes = valBytes; - this.start = start; - this.len = len; - } - - /** {@inheritDoc} */ - @Nullable @Override public <T> T value(CacheObjectContext ctx, boolean cpy) { - return (T)this; - } - - /** {@inheritDoc} */ - @Override public byte[] valueBytes(CacheObjectContext ctx) throws IgniteCheckedException { - toMarshaledFormIfNeeded(ctx); - - if (detached()) - return valBytes; - - byte[] arr = new byte[len]; - - U.arrayCopy(valBytes, start, arr, 0, len); - - return arr; - } - - /** {@inheritDoc} */ - @Override public CacheObject prepareForCache(CacheObjectContext ctx) { - if (detached()) - return this; - - return detach(); - } - - /** {@inheritDoc} */ - @Override public void finishUnmarshal(CacheObjectContext ctx, ClassLoader ldr) throws IgniteCheckedException { - assert val != null || valBytes != null; - - if (val == null && ctx.storeValue()) - val = ctx.processor().unmarshal(ctx, valBytes, start, len, ldr); - } - - /** {@inheritDoc} */ - @Override public void prepareMarshal(CacheObjectContext ctx) throws IgniteCheckedException { - assert val != null || valBytes != null; - - toMarshaledFormIfNeeded(ctx); - } - - /** {@inheritDoc} */ - @Override public byte directType() { - // refer to GridIoMessageFactory. - return 113; - } - - /** {@inheritDoc} */ - @Override public byte type() { - return TYPE_OPTIMIZED; - } - - /** - * Returns object's type ID. - * - * @return Type ID. - */ - public int typeId() { - assert valBytes != null; - - int typeId = UNSAFE.getInt(valBytes, BYTE_ARR_OFF + start + 1); - - if (typeId == 0) - throw new IgniteException("Object's type ID wasn't written to cache."); - - return typeId; - } - - /** - * Checks whether a wrapped object has field with name {@code fieldName}. - * - * @param fieldName Field name. - * @param marsh Marshaller. - * @return {@code true} if has. - * @throws IgniteCheckedException In case of error. - */ - public boolean hasField(String fieldName, OptimizedMarshallerExt marsh) throws IgniteCheckedException { - assert valBytes != null; - - return marsh.hasField(fieldName, valBytes, start, len); - } - - /** - * Searches and returns field if it exists. - * - * @param fieldName Field name. - * @param marsh Marshaller. - * @return Field. - * @throws IgniteCheckedException In case of error. - */ - public Object field(String fieldName, OptimizedMarshallerExt marsh) throws IgniteCheckedException { - assert valBytes != null; - - return marsh.readField(fieldName, valBytes, start, len, val != null ? val.getClass().getClassLoader() : null); - } - - /** - * Deserializes wrapped object. - * - * @param ctx Cache context. - * @return Deserialized object. - */ - public Object deserialize(CacheObjectContext ctx) { - if (val != null) - return val; - - try { - assert valBytes != null; - - Object val = ctx.processor().unmarshal(ctx, valBytes, start, len, - ctx.kernalContext().config().getClassLoader()); - - if (ctx.storeValue()) - this.val = val; - - return val; - } - catch (IgniteCheckedException e) { - throw new IgniteException("Failed to unmarshall object.", e); - } - } - - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - super.writeExternal(out); - - out.writeInt(start); - out.writeInt(len); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - super.readExternal(in); - - start = in.readInt(); - len = in.readInt(); - } - - /** {@inheritDoc} */ - @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) { - reader.setBuffer(buf); - - if (!reader.beforeMessageRead()) - return false; - - if (!super.readFrom(buf, reader)) - return false; - - switch (reader.state()) { - case 1: - len = reader.readInt("len"); - - if (!reader.isLastRead()) - return false; - - reader.incrementState(); - - case 2: - start = reader.readInt("start"); - - if (!reader.isLastRead()) - return false; - - reader.incrementState(); - - } - - return true; - } - - /** {@inheritDoc} */ - @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) { - writer.setBuffer(buf); - - if (!super.writeTo(buf, writer)) - return false; - - if (!writer.isHeaderWritten()) { - if (!writer.writeHeader(directType(), fieldsCount())) - return false; - - writer.onHeaderWritten(); - } - - switch (writer.state()) { - case 1: - if (!writer.writeInt("len", len)) - return false; - - writer.incrementState(); - - case 2: - if (!writer.writeInt("start", start)) - return false; - - writer.incrementState(); - - } - - return true; - } - - /** {@inheritDoc} */ - @Override public byte fieldsCount() { - return 3; - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - assert false; - - return super.hashCode(); - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object obj) { - assert false; - - return super.equals(obj); - } - - /** - * Detaches object. - * - * @return Detached object wrapped by {@code CacheOptimizedObjectImpl}. - */ - protected CacheOptimizedObjectImpl detach() { - if (detached()) - return this; - - byte[] arr = new byte[len]; - - U.arrayCopy(valBytes, start, arr, 0, len); - - return new CacheOptimizedObjectImpl(arr, 0, len); - } - - /** - * Checks whether the object is already detached or not. - * - * @return {@code true} if detached. - */ - protected boolean detached() { - return start == 0 && len == valBytes.length; - } - - /** - * Marshals {@link #val} to {@link #valBytes} if needed. - * - * @param ctx Cache object context. - * @throws IgniteCheckedException In case of error. - */ - protected void toMarshaledFormIfNeeded(CacheObjectContext ctx) throws IgniteCheckedException { - if (valBytes == null) { - assert val != null; - - valBytes = ctx.processor().marshal(ctx, val); - - start = 0; - len = valBytes.length; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheIndexedObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheIndexedObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheIndexedObjectImpl.java new file mode 100644 index 0000000..b63bca6 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheIndexedObjectImpl.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import org.jetbrains.annotations.*; + +/** + * Cache object implementation for classes that support footer injection is their serialized form thus enabling fields + * search and extraction without necessity to fully deserialize an object. + */ +public class KeyCacheIndexedObjectImpl extends CacheIndexedObjectImpl implements KeyCacheObject { + /** */ + private static final long serialVersionUID = 0L; + + /** + * + */ + public KeyCacheIndexedObjectImpl() { + // No-op + } + + /** + * @param val Object. + * @param valBytes Object in a serialized form. + */ + public KeyCacheIndexedObjectImpl(Object val, byte[] valBytes) { + super(val, valBytes); + + assert val != null; + } + + /** + * @param val Object. + * @param valBytes Object in a serialized form. + * @param start Object's start in the array. + * @param len Object's len in the array. + */ + public KeyCacheIndexedObjectImpl(Object val, byte[] valBytes, int start, int len) { + super(val, valBytes, start, len); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Nullable @Override public <T> T value(CacheObjectContext ctx, boolean cpy) { + return (T)this; + } + + /** {@inheritDoc} */ + @Override public CacheObject prepareForCache(CacheObjectContext ctx) { + return this; + } + + /** {@inheritDoc} */ + @Override public byte directType() { + // refer to GridIoMessageFactory. + return 113; + } + + /** {@inheritDoc} */ + @Override public boolean internal() { + assert val != null; + + return val instanceof GridCacheInternal; + } + + /** {@inheritDoc} */ + @Override public Object deserialize(CacheObjectContext ctx) { + assert val != null; + + return val; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + assert val != null; + + return val.hashCode(); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object obj) { + if (!(obj instanceof KeyCacheIndexedObjectImpl)) + return false; + + KeyCacheIndexedObjectImpl other = (KeyCacheIndexedObjectImpl)obj; + + return val.equals(other.val); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheOptimizedObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheOptimizedObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheOptimizedObjectImpl.java deleted file mode 100644 index 56e6fe2..0000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheOptimizedObjectImpl.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.ignite.internal.processors.cache; - -import org.jetbrains.annotations.*; - -/** - * Cache object implementation for classes that support footer injection is their serialized form thus enabling fields - * search and extraction without necessity to fully deserialize an object. - */ -public class KeyCacheOptimizedObjectImpl extends CacheOptimizedObjectImpl implements KeyCacheObject { - /** */ - private static final long serialVersionUID = 0L; - - /** - * - */ - public KeyCacheOptimizedObjectImpl() { - // No-op - } - - /** - * @param val Object. - * @param valBytes Object in a serialized form. - */ - public KeyCacheOptimizedObjectImpl(Object val, byte[] valBytes) { - super(val, valBytes); - - assert val != null; - } - - /** - * @param val Object. - * @param valBytes Object in a serialized form. - * @param start Object's start in the array. - * @param len Object's len in the array. - */ - public KeyCacheOptimizedObjectImpl(Object val, byte[] valBytes, int start, int len) { - super(val, valBytes, start, len); - } - - /** {@inheritDoc} */ - @SuppressWarnings("unchecked") - @Nullable @Override public <T> T value(CacheObjectContext ctx, boolean cpy) { - return (T)this; - } - - /** {@inheritDoc} */ - @Override public CacheObject prepareForCache(CacheObjectContext ctx) { - return this; - } - - /** {@inheritDoc} */ - @Override public byte directType() { - // refer to GridIoMessageFactory. - return 113; - } - - /** {@inheritDoc} */ - @Override public boolean internal() { - assert val != null; - - return val instanceof GridCacheInternal; - } - - /** {@inheritDoc} */ - @Override public Object deserialize(CacheObjectContext ctx) { - assert val != null; - - return val; - } - - /** {@inheritDoc} */ - @Override public int hashCode() { - assert val != null; - - return val.hashCode(); - } - - /** {@inheritDoc} */ - @Override public boolean equals(Object obj) { - if (!(obj instanceof KeyCacheOptimizedObjectImpl)) - return false; - - KeyCacheOptimizedObjectImpl other = (KeyCacheOptimizedObjectImpl)obj; - - return val.equals(other.val); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java index 748dd42..6ae958a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java @@ -196,10 +196,10 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme @SuppressWarnings("ExternalizableWithoutPublicNoArgConstructor") protected KeyCacheObject toCacheKeyObject0(Object obj, boolean userObj) { if (!userObj) - return isFieldsIndexingEnabled(obj.getClass()) ? new KeyCacheOptimizedObjectImpl(obj, null) : + return isFieldsIndexingEnabled(obj.getClass()) ? new KeyCacheIndexedObjectImpl(obj, null) : new KeyCacheObjectImpl(obj, null); - return isFieldsIndexingEnabled(obj.getClass()) ? new UserKeyCacheOptimizedObjectImpl(obj) : + return isFieldsIndexingEnabled(obj.getClass()) ? new UserKeyCacheIndexedObjectImpl(obj) : new UserKeyCacheObjectImpl(obj); } @@ -239,7 +239,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme return new CacheObjectImpl(null, bytes); case CacheObject.TYPE_OPTIMIZED: - return new CacheOptimizedObjectImpl(bytes, 0, bytes.length); + return new CacheIndexedObjectImpl(bytes, 0, bytes.length); } throw new IllegalArgumentException("Invalid object type: " + type); @@ -271,10 +271,10 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme } if (!userObj) - return isFieldsIndexingEnabled(obj.getClass()) ? new CacheOptimizedObjectImpl(obj) : + return isFieldsIndexingEnabled(obj.getClass()) ? new CacheIndexedObjectImpl(obj) : new CacheObjectImpl(obj, null); - return isFieldsIndexingEnabled(obj.getClass()) ? new UserCacheOptimizedObjectImpl(obj, null) : + return isFieldsIndexingEnabled(obj.getClass()) ? new UserCacheIndexedObjectImpl(obj, null) : new UserCacheObjectImpl(obj, null); } @@ -313,8 +313,8 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme /** {@inheritDoc} */ @Override public int typeId(Object obj) { - if (obj instanceof CacheOptimizedObjectImpl) - return ((CacheOptimizedObjectImpl)obj).typeId(); + if (obj instanceof CacheIndexedObjectImpl) + return ((CacheIndexedObjectImpl)obj).typeId(); return 0; } @@ -336,11 +336,11 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme /** {@inheritDoc} */ @Override public Object field(Object obj, String fieldName) { - if (obj instanceof CacheOptimizedObjectImpl) { + if (obj instanceof CacheIndexedObjectImpl) { assert optMarshExt != null; try { - return ((CacheOptimizedObjectImpl)obj).field(fieldName, optMarshExt); + return ((CacheIndexedObjectImpl)obj).field(fieldName, optMarshExt); } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -352,11 +352,11 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme /** {@inheritDoc} */ @Override public boolean hasField(Object obj, String fieldName) { - if (obj instanceof CacheOptimizedObjectImpl) { + if (obj instanceof CacheIndexedObjectImpl) { assert optMarshExt != null; try { - return ((CacheOptimizedObjectImpl)obj).hasField(fieldName, optMarshExt); + return ((CacheIndexedObjectImpl)obj).hasField(fieldName, optMarshExt); } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -480,14 +480,14 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme * Wraps value provided by user, must be serialized before stored in cache. * Used by classes that support fields indexing. Refer to {@link #isFieldsIndexingEnabled(Class)}. */ - private static class UserCacheOptimizedObjectImpl extends CacheOptimizedObjectImpl { + private static class UserCacheIndexedObjectImpl extends CacheIndexedObjectImpl { /** */ private static final long serialVersionUID = 0L; /** * */ - public UserCacheOptimizedObjectImpl() { + public UserCacheIndexedObjectImpl() { //No-op. } @@ -495,7 +495,7 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme * @param val Value. * @param valBytes Value bytes. */ - public UserCacheOptimizedObjectImpl(Object val, byte[] valBytes) { + public UserCacheIndexedObjectImpl(Object val, byte[] valBytes) { super(val, valBytes); } @@ -516,10 +516,10 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme Object val = this.val != null && ctx.processor().immutable(this.val) ? this.val : ctx.processor().unmarshal(ctx, valBytes, start, len, ldr); - return new CacheOptimizedObjectImpl(val, valBytes, start, len); + return new CacheIndexedObjectImpl(val, valBytes, start, len); } - return new CacheOptimizedObjectImpl(null, valBytes, start, len); + return new CacheIndexedObjectImpl(null, valBytes, start, len); } catch (IgniteCheckedException e) { throw new IgniteException("Failed to marshal object: " + val, e); @@ -531,21 +531,21 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme * Wraps key provided by user, must be serialized before stored in cache. * Used by classes that support fields indexing. Refer to {@link #isFieldsIndexingEnabled(Class)}. */ - private static class UserKeyCacheOptimizedObjectImpl extends KeyCacheOptimizedObjectImpl { + private static class UserKeyCacheIndexedObjectImpl extends KeyCacheIndexedObjectImpl { /** */ private static final long serialVersionUID = 0L; /** * */ - public UserKeyCacheOptimizedObjectImpl() { + public UserKeyCacheIndexedObjectImpl() { //No-op. } /** * @param key Key. */ - UserKeyCacheOptimizedObjectImpl(Object key) { + UserKeyCacheIndexedObjectImpl(Object key) { super(key, null); } @@ -560,10 +560,10 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme Object val = ctx.processor().unmarshal(ctx, valBytes, start, len, ldr); - return new KeyCacheOptimizedObjectImpl(val, valBytes, start, len); + return new KeyCacheIndexedObjectImpl(val, valBytes, start, len); } - return new KeyCacheOptimizedObjectImpl(val, valBytes, start, len); + return new KeyCacheIndexedObjectImpl(val, valBytes, start, len); } catch (IgniteCheckedException e) { throw new IgniteException("Failed to marshal object: " + val, e); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/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 e5800de..f51a0bb 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 @@ -47,6 +47,7 @@ import java.util.concurrent.*; import static org.apache.ignite.events.EventType.*; import static org.apache.ignite.internal.IgniteComponentType.*; import static org.apache.ignite.internal.processors.query.GridQueryIndexType.*; +import static org.apache.ignite.internal.processors.query.GridQueryProcessor.PropertyType.*; /** * Indexing processor. @@ -141,12 +142,12 @@ public class GridQueryProcessor extends GridProcessorAdapter { TypeId typeId; if (valCls == null || ctx.cacheObjects().isPortableEnabled()) { - processPortableMeta(meta, desc); + processCacheTypeMeta(meta, desc, PORTABLE_PROPERTY); typeId = new TypeId(ccfg.getName(), ctx.cacheObjects().typeId(meta.getValueType())); } else if (ctx.cacheObjects().enableFieldsIndexing(valCls)) { - processIndexedFieldsMeta(meta, desc); + processCacheTypeMeta(meta, desc, INDEXED_FIELDS_PROPERTY); typeId = new TypeId(ccfg.getName(), ctx.cacheObjects().typeId(valCls.getName())); } @@ -459,7 +460,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { TypeId id; boolean portableVal = ctx.cacheObjects().isPortableObject(val); - boolean indexedFieldsVal = val instanceof CacheOptimizedObjectImpl; + boolean indexedFieldsVal = val instanceof CacheIndexedObjectImpl; if (portableVal || indexedFieldsVal) { int typeId = ctx.cacheObjects().typeId(val); @@ -482,7 +483,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { "(multiple classes with same simple name are stored in the same cache) " + "[expCls=" + desc.valueClass().getName() + ", actualCls=" + valCls.getName() + ']'); - if (!(key instanceof CacheOptimizedObjectImpl) && !ctx.cacheObjects().isPortableObject(key)) { + if (!(key instanceof CacheIndexedObjectImpl) && !ctx.cacheObjects().isPortableObject(key)) { Class<?> keyCls = key.value(coctx, false).getClass(); if (!desc.keyClass().isAssignableFrom(keyCls)) @@ -1234,91 +1235,21 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * Processes declarative metadata for portable object. + * Processes declarative metadata. * * @param meta Declared metadata. * @param d Type descriptor. + * @param propertyType PropertyType. * @throws IgniteCheckedException If failed. */ - private void processPortableMeta(CacheTypeMetadata meta, TypeDescriptor d) + private void processCacheTypeMeta(CacheTypeMetadata meta, TypeDescriptor d, PropertyType propertyType) throws IgniteCheckedException { - for (Map.Entry<String, Class<?>> entry : meta.getAscendingFields().entrySet()) { - PortableProperty prop = buildPortableProperty(entry.getKey(), entry.getValue()); - - d.addProperty(prop, false); - - String idxName = prop.name() + "_idx"; - - d.addIndex(idxName, idx.isGeometryClass(prop.type()) ? GEO_SPATIAL : SORTED); - - d.addFieldToIndex(idxName, prop.name(), 0, false); - } - - for (Map.Entry<String, Class<?>> entry : meta.getDescendingFields().entrySet()) { - PortableProperty prop = buildPortableProperty(entry.getKey(), entry.getValue()); - - d.addProperty(prop, false); - - String idxName = prop.name() + "_idx"; - - d.addIndex(idxName, idx.isGeometryClass(prop.type()) ? GEO_SPATIAL : SORTED); - - d.addFieldToIndex(idxName, prop.name(), 0, true); - } - - for (String txtIdx : meta.getTextFields()) { - PortableProperty prop = buildPortableProperty(txtIdx, String.class); - - d.addProperty(prop, false); - - d.addFieldToTextIndex(prop.name()); - } - - Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> grps = meta.getGroups(); - - if (grps != null) { - for (Map.Entry<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> entry : grps.entrySet()) { - String idxName = entry.getKey(); - - LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> idxFields = entry.getValue(); - - int order = 0; - - for (Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> idxField : idxFields.entrySet()) { - PortableProperty prop = buildPortableProperty(idxField.getKey(), idxField.getValue().get1()); - - d.addProperty(prop, false); - - Boolean descending = idxField.getValue().get2(); - - d.addFieldToIndex(idxName, prop.name(), order, descending != null && descending); - - order++; - } - } - } - - for (Map.Entry<String, Class<?>> entry : meta.getQueryFields().entrySet()) { - PortableProperty prop = buildPortableProperty(entry.getKey(), entry.getValue()); - - if (!d.props.containsKey(prop.name())) - d.addProperty(prop, false); - } - } - - /** - * Processes declarative metadata for object that has fields information in its serialized form. - * - * @param meta Declared metadata. - * @param d Type descriptor. - * @throws IgniteCheckedException If failed. - */ - private void processIndexedFieldsMeta(CacheTypeMetadata meta, TypeDescriptor d) - throws IgniteCheckedException { - //TODO: IGNITE-950, refactor. The code is similar to portable properties ones. + assert propertyType != CLASS_PROPERTY; for (Map.Entry<String, Class<?>> entry : meta.getAscendingFields().entrySet()) { - IndexedFieldsProperty prop = buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); + Property prop = propertyType == PORTABLE_PROPERTY ? + buildPortableProperty(entry.getKey(), entry.getValue()) : + buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); d.addProperty(prop, false); @@ -1330,7 +1261,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry<String, Class<?>> entry : meta.getDescendingFields().entrySet()) { - IndexedFieldsProperty prop = buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); + Property prop = propertyType == PORTABLE_PROPERTY ? + buildPortableProperty(entry.getKey(), entry.getValue()) : + buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); d.addProperty(prop, false); @@ -1342,7 +1275,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (String txtIdx : meta.getTextFields()) { - IndexedFieldsProperty prop = buildIndexedFieldsProperty(txtIdx, String.class); + Property prop = propertyType == PORTABLE_PROPERTY ? + buildPortableProperty(txtIdx, String.class) : + buildIndexedFieldsProperty(txtIdx, String.class); d.addProperty(prop, false); @@ -1360,8 +1295,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { int order = 0; for (Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> idxField : idxFields.entrySet()) { - IndexedFieldsProperty prop = buildIndexedFieldsProperty(idxField.getKey(), - idxField.getValue().get1()); + Property prop = propertyType == PORTABLE_PROPERTY ? + buildPortableProperty(idxField.getKey(), idxField.getValue().get1()) : + buildIndexedFieldsProperty(idxField.getKey(), idxField.getValue().get1()); d.addProperty(prop, false); @@ -1375,7 +1311,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry<String, Class<?>> entry : meta.getQueryFields().entrySet()) { - IndexedFieldsProperty prop = buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); + Property prop = propertyType == PORTABLE_PROPERTY ? + buildPortableProperty(entry.getKey(), entry.getValue()) : + buildIndexedFieldsProperty(entry.getKey(), entry.getValue()); if (!d.props.containsKey(prop.name())) d.addProperty(prop, false); @@ -2247,4 +2185,13 @@ public class GridQueryProcessor extends GridProcessorAdapter { return S.toString(TypeName.class, this); } } + + /** + * + */ + enum PropertyType { + CLASS_PROPERTY, + PORTABLE_PROPERTY, + INDEXED_FIELDS_PROPERTY + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java index 2f42e8d..7a7ee69 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java @@ -248,7 +248,7 @@ public class OptimizedMarshallerUtils { if (obj == null) return false; - if (obj instanceof CacheOptimizedObjectImpl || + if (obj instanceof CacheIndexedObjectImpl || obj instanceof Map.Entry || obj instanceof Collection || obj instanceof Map || http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/ext/OptimizedObjectInputStreamExt.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/ext/OptimizedObjectInputStreamExt.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/ext/OptimizedObjectInputStreamExt.java index 1b75f57..66544a0 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/ext/OptimizedObjectInputStreamExt.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/ext/OptimizedObjectInputStreamExt.java @@ -125,7 +125,7 @@ public class OptimizedObjectInputStreamExt extends OptimizedObjectInputStream { if (in.readByte() == SERIALIZABLE && metaHandler.metadata(in.readInt()) != null) //Do we need to make a copy of array? - field = (F)new CacheOptimizedObjectImpl(in.array(), range.start, range.len); + field = (F)new CacheIndexedObjectImpl(in.array(), range.start, range.len); else { in.position(range.start); field = (F)readObject(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d9f85e69/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/ext/OptimizedMarshallerExtSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/ext/OptimizedMarshallerExtSelfTest.java b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/ext/OptimizedMarshallerExtSelfTest.java index 2526de7..c1f07ce 100644 --- a/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/ext/OptimizedMarshallerExtSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/marshaller/optimized/ext/OptimizedMarshallerExtSelfTest.java @@ -22,24 +22,44 @@ import org.apache.ignite.marshaller.*; import org.apache.ignite.marshaller.optimized.*; import org.apache.ignite.testframework.junits.common.*; +import java.util.concurrent.*; + /** * Optimized marshaller self test. */ @GridCommonTest(group = "Marshaller") public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest { + /** */ + private static ConcurrentHashMap<Integer, OptimizedObjectMetadata> META_BUF = new ConcurrentHashMap<>(); + + /** */ + private static final OptimizedMarshallerExtMetaHandler META_HANDLER = new OptimizedMarshallerExtMetaHandler() { + @Override public void addMeta(int typeId, OptimizedObjectMetadata meta) { + META_BUF.putIfAbsent(typeId, meta); + } + + @Override public OptimizedObjectMetadata metadata(int typeId) { + return META_BUF.get(typeId); + } + }; + /** {@inheritDoc} */ @Override protected Marshaller marshaller() { - return new OptimizedMarshallerExt(false); + return new InternalMarshaller(false); } /** * @throws Exception In case of error. */ public void testHasField() throws Exception { + META_BUF.clear(); + OptimizedMarshallerExt marsh = (OptimizedMarshallerExt)OptimizedMarshallerExtSelfTest.marsh; assertTrue(marsh.enableFieldsIndexing(TestObject.class)); + assertEquals(1, META_BUF.size()); + TestObject testObj = new TestObject("World", 50); byte[] arr = marsh.marshal(testObj); @@ -54,9 +74,12 @@ public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest * @throws Exception In case of error. */ public void testReadField() throws Exception { + META_BUF.clear(); + OptimizedMarshallerExt marsh = (OptimizedMarshallerExt)OptimizedMarshallerExtSelfTest.marsh; assertTrue(marsh.enableFieldsIndexing(TestObject.class)); + assertEquals(1, META_BUF.size()); TestObject testObj = new TestObject("World", 50); @@ -75,11 +98,12 @@ public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest // Add metadata for the enclosed object. assertTrue(marsh.enableFieldsIndexing(TestObject2.class)); + assertEquals(2, META_BUF.size()); arr = marsh.marshal(testObj); // Must be returned in a wrapped form, since metadata was added enabling the footer. - CacheOptimizedObjectImpl cacheObject = marsh.readField("o2", arr, 0, arr.length, null); + CacheIndexedObjectImpl cacheObject = marsh.readField("o2", arr, 0, arr.length, null); arr = cacheObject.valueBytes(null); @@ -92,9 +116,12 @@ public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest * @throws Exception In case of error. */ public void testHandles() throws Exception { + META_BUF.clear(); + OptimizedMarshallerExt marsh = (OptimizedMarshallerExt)OptimizedMarshallerExtSelfTest.marsh; assertTrue(marsh.enableFieldsIndexing(SelfLinkObject.class)); + assertEquals(1, META_BUF.size()); SelfLinkObject selfLinkObject = new SelfLinkObject(); selfLinkObject.str1 = "Hello, world!"; @@ -107,7 +134,7 @@ public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest assertEquals(selfLinkObject.str1, str2); - CacheOptimizedObjectImpl cacheObj = marsh.readField("link", arr, 0, arr.length, null); + CacheIndexedObjectImpl cacheObj = marsh.readField("link", arr, 0, arr.length, null); arr = cacheObj.valueBytes(null); @@ -116,6 +143,29 @@ public class OptimizedMarshallerExtSelfTest extends OptimizedMarshallerSelfTest assertEquals(selfLinkObject, selfLinkObject2); } + private static class InternalMarshaller extends OptimizedMarshallerExt { + /** + * Constructor. + */ + public InternalMarshaller() { + } + + /** + * Constructor. + * @param requireSer Requires serialiazable. + */ + public InternalMarshaller(boolean requireSer) { + super(requireSer); + + super.setMetadataHandler(META_HANDLER); + } + + /** {@inheritDoc} */ + @Override public void setMetadataHandler(OptimizedMarshallerExtMetaHandler metaHandler) { + // No-op + } + } + /** */ private static class TestObject2 { /** */