blob: 160c93079ea64c4aa69c3c8d0282d336325ba8fd [file] [log] [blame]
/*
* 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.
*/
'use strict';
require('jasmine-expect');
const Util = require('util');
const TestingHelper = require('../TestingHelper');
const { IgniteClient, ObjectType, MapObjectType, ComplexObjectType, BinaryObject } = require('apache-ignite-client');
const CACHE_NAME = '__test_cache';
const ONE_BYTE_MAX_OFFSET = 0x100 - 1;
const TWO_BYTES_MAX_OFFSET = 0x10000 - 1;
const COMPLEX_OBJECT_HEADER_LENGTH = 24;
class Class1 {
constructor() {
this.field_1_1 = null;
this.field_1_2 = new Class2();
this.field_1_3 = null;
}
}
class SubClass1 extends Class1 {
constructor() {
super();
this.field_1_4 = null;
this.field_1_5 = new Class3();
this.field_1_6 = null;
this.field_1_7 = null;
this.field_1_8 = null;
}
}
class Class2 {
constructor() {
this.field_2_1 = null;
this.field_2_2 = null;
}
}
class Class3 {
constructor() {
this.field_3_1 = null;
this.field_3_2 = null;
}
}
describe('complex object test suite >', () => {
let igniteClient = null;
beforeAll((done) => {
Promise.resolve().
then(async () => {
await TestingHelper.init();
igniteClient = TestingHelper.igniteClient;
await testSuiteCleanup(done);
await igniteClient.getOrCreateCache(CACHE_NAME);
}).
then(done).
catch(error => done.fail(error));
}, TestingHelper.TIMEOUT);
afterAll((done) => {
Promise.resolve().
then(async () => {
await testSuiteCleanup(done);
await TestingHelper.cleanUp();
}).
then(done).
catch(error => done.fail(error));
}, TestingHelper.TIMEOUT);
it('put get complex objects', (done) => {
Promise.resolve().
then(async () => {
const value1 = new Class1();
value1.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BYTE);
value1.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.SHORT);
value1.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
value1.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.LONG);
const valueType1 = new ComplexObjectType(new Class1()).
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2ShortInteger').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG);
const value2 = new SubClass1();
value2.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
value2.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
value2.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.CHAR);
value2.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
value2.field_1_4 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.STRING);
value2.field_1_5.field_3_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DATE);
value2.field_1_5.field_3_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.UUID);
value2.field_1_6 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DECIMAL);
value2.field_1_7 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.TIMESTAMP);
value2.field_1_8 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.TIME);
const valueType2 = new ComplexObjectType(new SubClass1()).
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2DoubleChar').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.CHAR)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.BOOLEAN).
setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.STRING).
setFieldType('field_1_5', new ComplexObjectType(new Class3()).
setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.DATE).
setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.UUID)).
setFieldType('field_1_6', ObjectType.PRIMITIVE_TYPE.DECIMAL).
setFieldType('field_1_7', ObjectType.PRIMITIVE_TYPE.TIMESTAMP).
setFieldType('field_1_8', ObjectType.PRIMITIVE_TYPE.TIME);
await putGetComplexObjectsWithDifferentTypes(
value1, value2, valueType1, valueType2, Class1, SubClass1);
}).
then(done).
catch(error => done.fail(error));
});
it('put get unnamed complex objects', (done) => {
Promise.resolve().
then(async () => {
const value1 = {};
value1.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BYTE);
value1.field_1_2 = {};
value1.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.SHORT);
value1.field_1_2.field_2_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
value1.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.LONG);
const valueType1 = new ComplexObjectType(value1, 'ObjectWithByteObjLong').
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE).
setFieldType('field_1_2', new ComplexObjectType(value1.field_1_2, 'ObjectWithShortInteger').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG);
const value2 = {};
value2.field_1_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
value2.field_1_2 = {};
value2.field_1_2.field_2_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
value2.field_1_2.field_2_2 = {};
value2.field_1_2.field_2_2.field_3_1 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.CHAR);
value2.field_1_2.field_2_2.field_3_2 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
value2.field_1_3 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.STRING);
value2.field_1_4 = getPrimitiveValue(ObjectType.PRIMITIVE_TYPE.DATE);
const valueType2 = new ComplexObjectType(value2, 'ObjectWithFloatObjStringDate').
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT).
setFieldType('field_1_2', new ComplexObjectType(value2.field_1_2, 'ObjectWithDoubleObj').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE).
setFieldType('field_2_2', new ComplexObjectType(value2.field_1_2.field_2_2, 'ObjectWithCharBoolean').
setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.CHAR).
setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.BOOLEAN))).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.STRING).
setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.DATE);
await putGetComplexObjects(value1, value2,
valueType1, valueType2, value2);
await putGetComplexObjects({}, {},
new ComplexObjectType({}), new ComplexObjectType({}), {});
let binaryKey = await BinaryObject.fromObject(value1, valueType1);
let binaryValue = await BinaryObject.fromObject(value2, valueType2);
await putGetComplexObjects(binaryKey, binaryValue,
null, null, value2);
binaryKey = await BinaryObject.fromObject({});
binaryValue = await BinaryObject.fromObject({});
await putGetComplexObjects(binaryKey, binaryValue,
null, null, {});
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects with arrays', (done) => {
Promise.resolve().
then(async () => {
const value1 = new Class1();
value1.field_1_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.BYTE_ARRAY);
value1.field_1_2.field_2_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.SHORT_ARRAY);
value1.field_1_2.field_2_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.INTEGER_ARRAY);
value1.field_1_3 = getArrayValues(ObjectType.PRIMITIVE_TYPE.LONG_ARRAY);
const valueType1 = new ComplexObjectType(new Class1(), 'Class1WithArrays').
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.BYTE_ARRAY).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortIntegerArrays').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT_ARRAY).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.INTEGER_ARRAY)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.LONG_ARRAY);
const value2 = new SubClass1();
value2.field_1_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.FLOAT_ARRAY);
value2.field_1_2.field_2_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DOUBLE_ARRAY);
value2.field_1_2.field_2_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.CHAR_ARRAY);
value2.field_1_3 = getArrayValues(ObjectType.PRIMITIVE_TYPE.BOOLEAN_ARRAY);
value2.field_1_4 = getArrayValues(ObjectType.PRIMITIVE_TYPE.STRING_ARRAY);
value2.field_1_5.field_3_1 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DATE_ARRAY);
value2.field_1_5.field_3_2 = getArrayValues(ObjectType.PRIMITIVE_TYPE.UUID_ARRAY);
value2.field_1_6 = getArrayValues(ObjectType.PRIMITIVE_TYPE.DECIMAL_ARRAY);
value2.field_1_7 = getArrayValues(ObjectType.PRIMITIVE_TYPE.TIMESTAMP_ARRAY);
value2.field_1_8 = getArrayValues(ObjectType.PRIMITIVE_TYPE.TIME_ARRAY);
const valueType2 = new ComplexObjectType(new SubClass1(), 'SubClass1WithArrays').
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.FLOAT_ARRAY).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithDoubleCharArrays').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.DOUBLE_ARRAY).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.CHAR_ARRAY)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.BOOLEAN_ARRAY).
setFieldType('field_1_4', ObjectType.PRIMITIVE_TYPE.STRING_ARRAY).
setFieldType('field_1_5', new ComplexObjectType(new Class3(), 'Class3WithArrays').
setFieldType('field_3_1', ObjectType.PRIMITIVE_TYPE.DATE_ARRAY).
setFieldType('field_3_2', ObjectType.PRIMITIVE_TYPE.UUID_ARRAY)).
setFieldType('field_1_6', ObjectType.PRIMITIVE_TYPE.DECIMAL_ARRAY).
setFieldType('field_1_7', ObjectType.PRIMITIVE_TYPE.TIMESTAMP_ARRAY).
setFieldType('field_1_8', ObjectType.PRIMITIVE_TYPE.TIME_ARRAY);
await putGetComplexObjectsWithDifferentTypes(
value1, value2, valueType1, valueType2, Class1, SubClass1, true);
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects with maps', (done) => {
Promise.resolve().
then(async () => {
const value1 = new Class1();
value1.field_1_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.BYTE);
value1.field_1_2.field_2_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.SHORT);
value1.field_1_2.field_2_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.INTEGER);
value1.field_1_3 = getMapValue(ObjectType.PRIMITIVE_TYPE.LONG);
const valueType1 = new ComplexObjectType(new Class1(), 'Class1WithMaps').
setFieldType('field_1_1', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.BYTE, ObjectType.PRIMITIVE_TYPE.BYTE)).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortIntegerMaps').
setFieldType('field_2_1', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.SHORT, ObjectType.PRIMITIVE_TYPE.SHORT)).
setFieldType('field_2_2', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.INTEGER))).
setFieldType('field_1_3', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.LONG, ObjectType.PRIMITIVE_TYPE.LONG));
const value2 = new SubClass1();
value2.field_1_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.FLOAT);
value2.field_1_2.field_2_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.DOUBLE);
value2.field_1_2.field_2_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.CHAR);
value2.field_1_3 = getMapValue(ObjectType.PRIMITIVE_TYPE.BOOLEAN);
value2.field_1_4 = getMapValue(ObjectType.PRIMITIVE_TYPE.STRING);
value2.field_1_5.field_3_1 = getMapValue(ObjectType.PRIMITIVE_TYPE.DATE);
value2.field_1_5.field_3_2 = getMapValue(ObjectType.PRIMITIVE_TYPE.UUID);
value2.field_1_6 = getMapValue(ObjectType.PRIMITIVE_TYPE.DECIMAL);
value2.field_1_7 = getMapValue(ObjectType.PRIMITIVE_TYPE.TIMESTAMP);
value2.field_1_8 = getMapValue(ObjectType.PRIMITIVE_TYPE.TIME);
const valueType2 = new ComplexObjectType(new SubClass1(), 'SubClass1WithMaps').
setFieldType('field_1_1', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.FLOAT)).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithDoubleCharMaps').
setFieldType('field_2_1', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DOUBLE)).
setFieldType('field_2_2', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.CHAR, ObjectType.PRIMITIVE_TYPE.CHAR))).
setFieldType('field_1_3', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.BOOLEAN, ObjectType.PRIMITIVE_TYPE.BOOLEAN)).
setFieldType('field_1_4', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.STRING)).
setFieldType('field_1_5', new ComplexObjectType(new Class3(), 'Class3WithMaps').
setFieldType('field_3_1', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DATE)).
setFieldType('field_3_2', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.UUID))).
setFieldType('field_1_6', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.DECIMAL)).
setFieldType('field_1_7', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.TIMESTAMP)).
setFieldType('field_1_8', new MapObjectType(
MapObjectType.MAP_SUBTYPE.HASH_MAP, ObjectType.PRIMITIVE_TYPE.STRING, ObjectType.PRIMITIVE_TYPE.TIME));
await putGetComplexObjectsWithDifferentTypes(
value1, value2, valueType1, valueType2, Class1, SubClass1, true);
}).
then(done).
catch(error => done.fail(error));
});
it('put get binary objects from objects', (done) => {
Promise.resolve().
then(async () => {
const valueType = new ComplexObjectType(new Class1(), 'Class1WithStringObjStringArray').
setFieldType('field_1_1', ObjectType.PRIMITIVE_TYPE.STRING).
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2WithShortBoolean').
setFieldType('field_2_1', ObjectType.PRIMITIVE_TYPE.SHORT).
setFieldType('field_2_2', ObjectType.PRIMITIVE_TYPE.BOOLEAN)).
setFieldType('field_1_3', ObjectType.PRIMITIVE_TYPE.STRING_ARRAY);
await putGetBinaryObjects(valueType);
const defaultValueType = new ComplexObjectType(new Class1(), 'Class1Default').
setFieldType('field_1_2', new ComplexObjectType(new Class2(), 'Class2Default'));
await putGetBinaryObjects(defaultValueType);
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects with one byte offset', (done) => {
Promise.resolve().
then(async () => {
const key = new Date();
const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
const value = new Class2();
value.field_2_1 = 'x';
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
const oneByteMaxLen = getMaxFieldLength(true);
value.field_2_1 = 'x'.repeat(oneByteMaxLen);
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects with two bytes offset', (done) => {
Promise.resolve().
then(async () => {
const key = new Date();
const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
const value = new Class2();
const oneByteMaxLen = getMaxFieldLength(true);
value.field_2_1 = 'x'.repeat(oneByteMaxLen + 1);
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
const twoBytesMaxLen = getMaxFieldLength(false);
value.field_2_1 = 'x'.repeat(twoBytesMaxLen);
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects with four bytes offset', (done) => {
Promise.resolve().
then(async () => {
const key = new Date();
const valueType = new ComplexObjectType(new Class2(), 'Class2WithStrings');
const value = new Class2();
const twoBytesMaxLen = getMaxFieldLength(false);
value.field_2_1 = 'x'.repeat(twoBytesMaxLen + 1);
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
value.field_2_1 = 'x'.repeat(twoBytesMaxLen * 2);
value.field_2_2 = 'y';
await putGetComplexObjects(key, value, null, valueType, value);
}).
then(done).
catch(error => done.fail(error));
});
it('put get complex objects without schema', (done) => {
Promise.resolve().
then(async () => {
const key = new Date();
const valueType = new ComplexObjectType({});
const value = {};
await putGetComplexObjects(key, value, null, valueType, value);
}).
then(done).
catch(error => done.fail(error));
});
function getMaxFieldLength(oneByte) {
const maxOffset = oneByte ? ONE_BYTE_MAX_OFFSET : TWO_BYTES_MAX_OFFSET;
// max offset - field type code - field type (string) length - complex object header length
return maxOffset - 1 - 4 - COMPLEX_OBJECT_HEADER_LENGTH;
}
async function testSuiteCleanup(done) {
await TestingHelper.destroyCache(CACHE_NAME, done);
}
async function putGetComplexObjects(key, value, keyType, valueType, valuePattern) {
const cache = igniteClient.getCache(CACHE_NAME).setKeyType(keyType).setValueType(valueType);
try {
await cache.put(key, value);
const result = await cache.get(key);
expect(await TestingHelper.compare(valuePattern, result)).toBe(true,
`values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(result)}`);
}
finally {
await cache.removeAll();
}
}
async function binaryObjectEquals(binaryObj, valuePattern, valueType) {
expect(await TestingHelper.compare(valuePattern, binaryObj)).toBe(true,
`binary values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(binaryObj)}`);
let value1, value2;
for (let key of Object.keys(valuePattern)) {
value1 = valuePattern[key];
value2 = await binaryObj.getField(key, valueType ? valueType._getFieldType(key) : null);
expect(await TestingHelper.compare(value1, value2)).toBe(true,
`values for key ${key} are not equal: put value=${TestingHelper.printValue(value1)
}, get value=${TestingHelper.printValue(value2)}`);
}
if (valueType) {
const toObject = await binaryObj.toObject(valueType);
expect(await TestingHelper.compare(valuePattern, toObject)).toBe(true,
`values are not equal: put value=${TestingHelper.printValue(valuePattern)}, get value=${TestingHelper.printValue(toObject)}`);
}
}
async function putGetComplexObjectsWithDifferentTypes(
key, value, keyType, valueType, keyClass, valueClass, isNullable = false) {
await putGetComplexObjects(key, value, keyType, valueType, value);
if (isNullable) {
await putGetComplexObjects(new keyClass(), new valueClass(), keyType, valueType, new valueClass());
}
let binaryKey = await BinaryObject.fromObject(key, keyType);
let binaryValue = await BinaryObject.fromObject(value, valueType);
await putGetComplexObjects(binaryKey, binaryValue, null, null, value);
if (isNullable) {
binaryKey = await BinaryObject.fromObject(new keyClass(), keyType);
binaryValue = await BinaryObject.fromObject(new valueClass(), valueType);
await putGetComplexObjects(binaryKey, binaryValue, null, null, new valueClass());
}
}
async function putGetBinaryObjects(valueType) {
const value1 = new Class1();
value1.field_1_1 = 'abc';
value1.field_1_2.field_2_1 = 1234;
value1.field_1_2.field_2_2 = true;
value1.field_1_3 = ['a', 'bb', 'ccc'];
const value2 = new Class1();
value2.field_1_1 = 'def';
value2.field_1_2.field_2_1 = 5432;
value2.field_1_2.field_2_2 = false;
value2.field_1_3 = ['a', 'bb', 'ccc', 'dddd'];
const value3 = new Class1();
value3.field_1_1 = 'defdef';
value3.field_1_2.field_2_1 = 543;
value3.field_1_2.field_2_2 = false;
value3.field_1_3 = ['a', 'bb', 'ccc', 'dddd', 'eeeee'];
const field_1_2_Type = valueType ? valueType._getFieldType('field_1_2') : null;
const binaryValue1 = await BinaryObject.fromObject(value1, valueType);
const binaryValue2 = await BinaryObject.fromObject(value2, valueType);
const binaryValue3 = await BinaryObject.fromObject(value3, valueType);
const cache = igniteClient.getCache(CACHE_NAME);
try {
await cache.put(binaryValue1, binaryValue2);
let result = await cache.get(binaryValue1);
await binaryObjectEquals(result, value2, valueType);
binaryValue1.setField('field_1_1', 'abcde');
result = await cache.get(binaryValue1);
expect(result === null).toBe(true);
binaryValue2.setField('field_1_1', value3.field_1_1);
binaryValue2.setField('field_1_2', value3.field_1_2, field_1_2_Type);
binaryValue2.setField('field_1_3', value3.field_1_3);
await cache.put(binaryValue1, binaryValue2);
result = await cache.get(binaryValue1);
await binaryObjectEquals(result, value3, valueType);
binaryValue1.setField('field_1_1', 'abc');
binaryValue1.setField('field_1_3', await binaryValue1.getField('field_1_3'));
result = await cache.get(binaryValue1);
await binaryObjectEquals(result, value2, valueType);
result = await cache.get(binaryValue1);
await binaryObjectEquals(result, value2, valueType);
binaryValue3.setField('field_1_1', await result.getField('field_1_1'));
binaryValue3.setField('field_1_2', await result.getField('field_1_2', field_1_2_Type), field_1_2_Type);
binaryValue3.setField('field_1_3', await result.getField('field_1_3'));
await cache.put(binaryValue1, binaryValue3);
result = await cache.get(binaryValue1);
await binaryObjectEquals(result, value2, valueType);
}
finally {
await cache.removeAll();
}
}
function getPrimitiveValue(typeCode) {
return TestingHelper.primitiveValues[typeCode].values[0];
}
function getArrayValues(typeCode) {
return TestingHelper.primitiveValues[TestingHelper.arrayValues[typeCode].elemType].values;
}
function getMapValue(typeCode) {
const map = new Map();
const values = TestingHelper.primitiveValues[typeCode].values;
const length = values.length;
values.forEach((value, index) => {
if (!TestingHelper.primitiveValues[typeCode].isMapKey) {
value = Util.format("%s", value);
}
map.set(value, values[length - index - 1]);
});
return map;
}
});