You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by is...@apache.org on 2018/06/28 12:48:39 UTC
[03/50] [abbrv] ignite git commit: query tests
query tests
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3afd3b55
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3afd3b55
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3afd3b55
Branch: refs/heads/ignite-7777
Commit: 3afd3b559b485edcd26123f08c5bfec755ae521d
Parents: 289a83b
Author: ekaterina-nbl <ek...@nobitlost.com>
Authored: Tue May 8 21:07:55 2018 +0300
Committer: ekaterina-nbl <ek...@nobitlost.com>
Committed: Tue May 8 21:07:55 2018 +0300
----------------------------------------------------------------------
.../nodejs/examples/SqlQueryExample.js | 1 -
modules/platforms/nodejs/lib/Cursor.js | 50 ++--
modules/platforms/nodejs/lib/Query.js | 8 +-
.../nodejs/lib/internal/BinaryUtils.js | 5 +-
.../spec/cache/CachePutGetDiffTypes.spec.js | 8 +-
.../nodejs/spec/query/ScanQuery.spec.js | 207 ++++++++++++++++
.../nodejs/spec/query/SqlFieldsQuery.spec.js | 247 +++++++++++++++++++
.../nodejs/spec/query/SqlQuery.spec.js | 247 +++++++++++++++++++
8 files changed, 736 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/examples/SqlQueryExample.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/examples/SqlQueryExample.js b/modules/platforms/nodejs/examples/SqlQueryExample.js
index 5f8d40d..a3ae12a 100644
--- a/modules/platforms/nodejs/examples/SqlQueryExample.js
+++ b/modules/platforms/nodejs/examples/SqlQueryExample.js
@@ -66,7 +66,6 @@ class SqlQueryExample {
const cacheCfg = new CacheConfiguration().
setQueryEntities(
new QueryEntity().
- setKeyTypeName('INT').
setValueTypeName('Person').
setFields([
new QueryField('id', 'java.lang.Integer'),
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/lib/Cursor.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/lib/Cursor.js b/modules/platforms/nodejs/lib/Cursor.js
index dfdb4ed..b97a82f 100644
--- a/modules/platforms/nodejs/lib/Cursor.js
+++ b/modules/platforms/nodejs/lib/Cursor.js
@@ -49,7 +49,7 @@ class Cursor {
await this._getValues();
this._valueIndex = 0;
}
- if (this._values) {
+ if (this._values && this._values.length > 0) {
const value = this._values[this._valueIndex];
this._valueIndex++;
return value;
@@ -162,27 +162,31 @@ class Cursor {
buffer.writeLong(this._id);
}
+ /**
+ * @ignore
+ */
+ _readId(buffer) {
+ this._id = buffer.readLong();
+ }
/**
* @ignore
*/
- async _read(buffer) {
- const id = buffer.readLong();
- if (this._id) {
- if (!this._id.equals(id)) {
- throw Errors.IgniteClientError.internalError();
- }
- }
- else {
- this._id = id;
- }
+ async _readRow(buffer) {
const CacheEntry = require('./CacheClient').CacheEntry;
+ return new CacheEntry(
+ await BinaryReader.readObject(buffer, this._keyType),
+ await BinaryReader.readObject(buffer, this._valueType));
+ }
+
+ /**
+ * @ignore
+ */
+ async _read(buffer) {
const rowCount = buffer.readInteger();
this._values = new Array(rowCount);
for (let i = 0; i < rowCount; i++) {
- this._values[i] = new CacheEntry(
- await BinaryReader.readObject(buffer, this._keyType),
- await BinaryReader.readObject(buffer, this._valueType));
+ this._values[i] = await this._readRow(buffer);
}
this._hasNext = buffer.readBoolean();
}
@@ -289,20 +293,14 @@ class SqlFieldsCursor extends Cursor {
/**
* @ignore
*/
- async _read(buffer) {
- const rowCount = buffer.readInteger();
- this._values = new Array(rowCount);
- let values;
+ async _readRow(buffer) {
+ let values = new Array(this._fieldCount);
let fieldType;
- for (let i = 0; i < rowCount; i++) {
- values = new Array(this._fieldCount);
- for (let j = 0; j < this._fieldCount; j++) {
- fieldType = this._fieldTypes && j < this._fieldTypes.length ? this._fieldTypes[j] : null;
- values[j] = await BinaryReader.readObject(buffer);
- }
- this._values[i] = values;
+ for (let i = 0; i < this._fieldCount; i++) {
+ fieldType = this._fieldTypes && i < this._fieldTypes.length ? this._fieldTypes[i] : null;
+ values[i] = await BinaryReader.readObject(buffer);
}
- this._hasNext = buffer.readBoolean();
+ return values;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/lib/Query.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/lib/Query.js b/modules/platforms/nodejs/lib/Query.js
index e17e0c3..3458899 100644
--- a/modules/platforms/nodejs/lib/Query.js
+++ b/modules/platforms/nodejs/lib/Query.js
@@ -249,7 +249,9 @@ class SqlQuery extends Query {
* @ignore
*/
async _getCursor(socket, payload, keyType = null, valueType = null) {
- return new Cursor(socket, BinaryUtils.OPERATION.QUERY_SQL_CURSOR_GET_PAGE, payload, keyType, valueType);
+ const cursor = new Cursor(socket, BinaryUtils.OPERATION.QUERY_SQL_CURSOR_GET_PAGE, payload, keyType, valueType);
+ cursor._readId(payload);
+ return cursor;
}
}
@@ -492,7 +494,9 @@ class ScanQuery extends Query {
* @ignore
*/
async _getCursor(socket, payload, keyType = null, valueType = null) {
- return new Cursor(socket, BinaryUtils.OPERATION.QUERY_SCAN_CURSOR_GET_PAGE, payload, keyType, valueType);
+ const cursor = new Cursor(socket, BinaryUtils.OPERATION.QUERY_SCAN_CURSOR_GET_PAGE, payload, keyType, valueType);
+ cursor._readId(payload);
+ return cursor;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/lib/internal/BinaryUtils.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/lib/internal/BinaryUtils.js b/modules/platforms/nodejs/lib/internal/BinaryUtils.js
index b602cbe..ab2d40c 100644
--- a/modules/platforms/nodejs/lib/internal/BinaryUtils.js
+++ b/modules/platforms/nodejs/lib/internal/BinaryUtils.js
@@ -365,10 +365,7 @@ class BinaryUtils {
return;
}
const valueTypeCode = BinaryUtils.getTypeCode(BinaryUtils.calcObjectType(value));
- if (typeCode === BinaryUtils.TYPE_CODE.BINARY_OBJECT &&
- valueTypeCode === BinaryUtils.TYPE_CODE.COMPLEX_OBJECT ||
- typeCode !== BinaryUtils.TYPE_CODE.BINARY_OBJECT &&
- valueTypeCode === BinaryUtils.TYPE_CODE.BINARY_OBJECT) {
+ if (typeCode !== valueTypeCode) {
throw Errors.IgniteClientError.typeCastError(valueTypeCode, typeCode);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/spec/cache/CachePutGetDiffTypes.spec.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/spec/cache/CachePutGetDiffTypes.spec.js b/modules/platforms/nodejs/spec/cache/CachePutGetDiffTypes.spec.js
index 6e75078..eb0f2be 100644
--- a/modules/platforms/nodejs/spec/cache/CachePutGetDiffTypes.spec.js
+++ b/modules/platforms/nodejs/spec/cache/CachePutGetDiffTypes.spec.js
@@ -441,7 +441,7 @@ describe('cache put get test suite >', () => {
}
let array = new Array();
- for (let i = 0; i < 10; i++) {
+ for (let i = 0; i < 5; i++) {
for (let field in object) {
const type = parseInt(field.substring(5));
object[field] = TestingHelper.primitiveValues[type].modificator(object[field]);
@@ -468,7 +468,7 @@ describe('cache put get test suite >', () => {
}
const objectType = new ComplexObjectType(object, 'tstComplObjectWithDefaultFieldTypes');
let array = new Array();
- for (let i = 0; i < 10; i++) {
+ for (let i = 0; i < 5; i++) {
for (let field in object) {
const type = parseInt(field.substring(5));
object[field] = TestingHelper.primitiveValues[type].modificator(object[field]);
@@ -492,7 +492,7 @@ describe('cache put get test suite >', () => {
binObject.setField('field' + type, typeInfo.values[0], type);
}
let array = new Array();
- for (let i = 0; i < 10; i++) {
+ for (let i = 0; i < 5; i++) {
for (let field of binObject.getFieldNames()) {
const type = parseInt(field.substring(5));
binObject.setField(
@@ -525,7 +525,7 @@ describe('cache put get test suite >', () => {
}
let array = new Array();
- for (let i = 0; i < 4; i++) {
+ for (let i = 0; i < 2; i++) {
let innerArray = new Array();
for (let j = 0; j < 2; j++) {
for (let field in object) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/spec/query/ScanQuery.spec.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/spec/query/ScanQuery.spec.js b/modules/platforms/nodejs/spec/query/ScanQuery.spec.js
new file mode 100644
index 0000000..ab28973
--- /dev/null
+++ b/modules/platforms/nodejs/spec/query/ScanQuery.spec.js
@@ -0,0 +1,207 @@
+/*
+ * 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 config = require('../config');
+const TestingHelper = require('../TestingHelper');
+const IgniteClient = require('apache-ignite-client');
+const Errors = IgniteClient.Errors;
+const ScanQuery = IgniteClient.ScanQuery;
+const ObjectType = IgniteClient.ObjectType;
+
+const CACHE_NAME = '__test_cache';
+const ELEMENTS_NUMBER = 10;
+
+describe('scan query 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);
+ await generateData(done);
+ }).
+ 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());
+ }, TestingHelper.TIMEOUT);
+
+ it('get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery());
+ const set = new Set();
+ for (let cacheEntry of await cursor.getAll()) {
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue()).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get all with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery().setPageSize(1));
+ const set = new Set();
+ for (let cacheEntry of await cursor.getAll()) {
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue()).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery());
+ const set = new Set();
+ do {
+ let cacheEntry = await cursor.getValue();
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue()).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery().setPageSize(2));
+ const set = new Set();
+ do {
+ let cacheEntry = await cursor.getValue();
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue()).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery().setPageSize(1));
+ await cursor.getValue();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor after get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery());
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('scan query settings', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new ScanQuery().
+ setPartitionNumber(0).
+ setPageSize(2).
+ setLocal(true));
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+
+ it('scan empty cache', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ await cache.removeAll();
+ let cursor = await cache.query(new ScanQuery());
+ const cacheEntries = await cursor.getAll();
+ expect(cacheEntries.length).toBe(0);
+ await cursor.close();
+
+ cursor = await cache.query(new ScanQuery());
+ expect(await cursor.getValue()).toBe(null);
+ expect(cursor.hasMore()).toBe(false);
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ async function testSuiteCleanup(done) {
+ await TestingHelper.destroyCache(CACHE_NAME, done);
+ }
+
+ async function generateData(done) {
+ try {
+ let cache = igniteClient.getCache(CACHE_NAME).
+ setKeyType(ObjectType.PRIMITIVE_TYPE.INTEGER);
+ for (let i = 0; i < ELEMENTS_NUMBER; i++) {
+ await cache.put(i, generateValue(i));
+ }
+ }
+ catch (err) {
+ done.fail('unexpected error: ' + err);
+ }
+ }
+
+ function generateValue(key) {
+ return 'value' + key;
+ }
+});
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/spec/query/SqlFieldsQuery.spec.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/spec/query/SqlFieldsQuery.spec.js b/modules/platforms/nodejs/spec/query/SqlFieldsQuery.spec.js
new file mode 100644
index 0000000..c81838a
--- /dev/null
+++ b/modules/platforms/nodejs/spec/query/SqlFieldsQuery.spec.js
@@ -0,0 +1,247 @@
+/*
+ * 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 config = require('../config');
+const TestingHelper = require('../TestingHelper');
+const IgniteClient = require('apache-ignite-client');
+const Errors = IgniteClient.Errors;
+const SqlFieldsQuery = IgniteClient.SqlFieldsQuery;
+const ObjectType = IgniteClient.ObjectType;
+const CacheConfiguration = IgniteClient.CacheConfiguration;
+
+const CACHE_NAME = '__test_cache';
+const TABLE_NAME = '__test_SqlFieldsQuery_table';
+const ELEMENTS_NUMBER = 10;
+
+describe('sql fields query 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, new CacheConfiguration().setSqlSchema('PUBLIC'));
+ await generateData(done);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ }, TestingHelper.TIMEOUT);
+
+ afterAll((done) => {
+ Promise.resolve().
+ then(async () => {
+ await dropTables(done);
+ await testSuiteCleanup(done);
+ await TestingHelper.cleanUp();
+ }).
+ then(done).
+ catch(error => done());
+ }, TestingHelper.TIMEOUT);
+
+ it('get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`));
+ const set = new Set();
+ for (let fields of await cursor.getAll()) {
+ expect(fields.length).toBe(2);
+ expect(generateValue(fields[0]) === fields[1]).toBe(true);
+ set.add(fields[0]);
+ expect(fields[0] >= 0 && fields[0] < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get all with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ const set = new Set();
+ for (let fields of await cursor.getAll()) {
+ expect(fields.length).toBe(2);
+ expect(generateValue(fields[0]) === fields[1]).toBe(true);
+ set.add(fields[0]);
+ expect(fields[0] >= 0 && fields[0] < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`));
+ const set = new Set();
+ do {
+ let fields = await cursor.getValue();
+ expect(fields.length).toBe(2);
+ expect(generateValue(fields[0]) === fields[1]).toBe(true);
+ set.add(fields[0]);
+ expect(fields[0] >= 0 && fields[0] < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`).setPageSize(2));
+ const set = new Set();
+ do {
+ let fields = await cursor.getValue();
+ expect(fields.length).toBe(2);
+ expect(generateValue(fields[0]) === fields[1]).toBe(true);
+ set.add(fields[0]);
+ expect(fields[0] >= 0 && fields[0] < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ await cursor.getValue();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor after get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`));
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('sql fields query settings', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ const cursor = await cache.query(new SqlFieldsQuery(`SELECT * FROM ${TABLE_NAME}`).
+ setPageSize(2).
+ setLocal(false).
+ setSql(`INSERT INTO ${TABLE_NAME} (field1, field2) VALUES (?, ?)`).
+ setArgTypes(ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.STRING).
+ setArgs(50, 'test').
+ setDistributedJoins(true).
+ setReplicatedOnly(false).
+ setTimeout(10000).
+ setSchema('PUBLIC').
+ setMaxRows(20).
+ setStatementType(SqlFieldsQuery.STATEMENT_TYPE.ANY).
+ setEnforceJoinOrder(true).
+ setCollocated(false).
+ setLazy(true).
+ setIncludeFieldNames(true));
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get empty results', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ await cache.removeAll();
+ let cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT field1 FROM ${TABLE_NAME} WHERE field1 > 100`));
+ const cacheEntries = await cursor.getAll();
+ expect(cacheEntries.length).toBe(0);
+ await cursor.close();
+
+ cursor = await cache.query(
+ new SqlFieldsQuery(`SELECT field1 FROM ${TABLE_NAME} WHERE field1 > 100`));
+ expect(await cursor.getValue()).toBe(null);
+ expect(cursor.hasMore()).toBe(false);
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ async function dropTables(done) {
+ try {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ (await cache.query(new SqlFieldsQuery(`DROP TABLE ${TABLE_NAME}`))).getAll();
+ }
+ catch (err) {
+ done.fail('unexpected error: ' + err);
+ }
+ }
+
+ async function testSuiteCleanup(done) {
+ await TestingHelper.destroyCache(CACHE_NAME, done);
+ }
+
+ async function generateData(done) {
+ try {
+ let cache = igniteClient.getCache(CACHE_NAME);
+ (await cache.query(new SqlFieldsQuery(
+ `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (field1 INT, field2 VARCHAR, PRIMARY KEY (field1))`))).getAll();
+
+ const insertQuery = new SqlFieldsQuery(`INSERT INTO ${TABLE_NAME} (field1, field2) VALUES (?, ?)`).
+ setArgTypes(ObjectType.PRIMITIVE_TYPE.INTEGER);
+
+ for (let i = 0; i < ELEMENTS_NUMBER; i++) {
+ (await cache.query(insertQuery.setArgs(i, generateValue(i)))).getAll();
+ }
+ }
+ catch (err) {
+ done.fail('unexpected error: ' + err);
+ }
+ }
+
+ function generateValue(key) {
+ return 'value' + key;
+ }
+});
http://git-wip-us.apache.org/repos/asf/ignite/blob/3afd3b55/modules/platforms/nodejs/spec/query/SqlQuery.spec.js
----------------------------------------------------------------------
diff --git a/modules/platforms/nodejs/spec/query/SqlQuery.spec.js b/modules/platforms/nodejs/spec/query/SqlQuery.spec.js
new file mode 100644
index 0000000..2bbd0e5
--- /dev/null
+++ b/modules/platforms/nodejs/spec/query/SqlQuery.spec.js
@@ -0,0 +1,247 @@
+/*
+ * 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 config = require('../config');
+const TestingHelper = require('../TestingHelper');
+const IgniteClient = require('apache-ignite-client');
+const Errors = IgniteClient.Errors;
+const SqlQuery = IgniteClient.SqlQuery;
+const SqlFieldsQuery = IgniteClient.SqlFieldsQuery;
+const ObjectType = IgniteClient.ObjectType;
+const CacheConfiguration = IgniteClient.CacheConfiguration;
+const QueryEntity = IgniteClient.QueryEntity;
+const QueryField = IgniteClient.QueryField;
+const ComplexObjectType = IgniteClient.ComplexObjectType;
+
+const CACHE_NAME = '__test_cache';
+const TABLE_NAME = '__test_SqlQuery';
+const ELEMENTS_NUMBER = 10;
+
+describe('sql query 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,
+ new CacheConfiguration().
+ setQueryEntities(
+ new QueryEntity().
+ setKeyTypeName('java.lang.Integer').
+ setValueTypeName(TABLE_NAME).
+ setFields([
+ new QueryField('field1', 'java.lang.Integer'),
+ new QueryField('field2', 'java.lang.String')
+ ])));
+ await generateData(done);
+ }).
+ 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());
+ }, TestingHelper.TIMEOUT);
+
+ it('get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`));
+ const set = new Set();
+ for (let cacheEntry of await cursor.getAll()) {
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue().field2).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get all with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ const set = new Set();
+ for (let cacheEntry of await cursor.getAll()) {
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue().field2).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ }
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`));
+ const set = new Set();
+ do {
+ let cacheEntry = await cursor.getValue();
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue().field2).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get value with page size', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).setPageSize(2));
+ const set = new Set();
+ do {
+ let cacheEntry = await cursor.getValue();
+ expect(generateValue(cacheEntry.getKey()) === cacheEntry.getValue().field2).toBe(true);
+ set.add(cacheEntry.getKey());
+ expect(cacheEntry.getKey() >= 0 && cacheEntry.getKey() < ELEMENTS_NUMBER).toBe(true);
+ } while (cursor.hasMore());
+ expect(set.size).toBe(ELEMENTS_NUMBER);
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ await cursor.getValue();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('close cursor after get all', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(
+ new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`));
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('sql query settings', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ const cursor = await cache.query(new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).
+ setType(TABLE_NAME).
+ setPageSize(2).
+ setLocal(false).
+ setSql('field1 > ? and field1 <= ?').
+ setArgTypes(ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.INTEGER).
+ setArgs(3, 7).
+ setDistributedJoins(true).
+ setReplicatedOnly(false).
+ setTimeout(10000));
+ await cursor.getAll();
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ it('get values from empty cache', (done) => {
+ Promise.resolve().
+ then(async () => {
+ let cache = getCache();
+ await cache.removeAll();
+ let cursor = await cache.query(new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ const cacheEntries = await cursor.getAll();
+ expect(cacheEntries.length).toBe(0);
+ await cursor.close();
+
+ cursor = await cache.query(new SqlQuery(TABLE_NAME, `SELECT * FROM ${TABLE_NAME}`).setPageSize(1));
+ expect(await cursor.getValue()).toBe(null);
+ expect(cursor.hasMore()).toBe(false);
+ await cursor.close();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ async function testSuiteCleanup(done) {
+ await TestingHelper.destroyCache(CACHE_NAME, done);
+ }
+
+ function getCache() {
+ return igniteClient.getCache(CACHE_NAME).
+ setKeyType(ObjectType.PRIMITIVE_TYPE.INTEGER).
+ setValueType(new ComplexObjectType({
+ 'field1' : 1,
+ 'field2' : 'a'
+ }, TABLE_NAME).
+ setFieldType('field1', ObjectType.PRIMITIVE_TYPE.INTEGER));
+ }
+
+ async function generateData(done) {
+ try {
+ let cache = igniteClient.getCache(CACHE_NAME);
+
+ const insertQuery = new SqlFieldsQuery(`INSERT INTO ${TABLE_NAME} (_key, field1, field2) VALUES (?, ?, ?)`).
+ setArgTypes(ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.INTEGER);
+
+ for (let i = 0; i < ELEMENTS_NUMBER; i++) {
+ (await cache.query(insertQuery.setArgs(i, i, generateValue(i)))).getAll();
+ }
+ }
+ catch (err) {
+ done.fail('unexpected error: ' + err);
+ }
+ }
+
+ function generateValue(key) {
+ return 'value' + key;
+ }
+});