blob: 35f3980ff30ef3602f7b252b5cfcd063c7e4d5e8 [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';
const assert = require('assert');
const Cache = require('../../../lib/mapping/cache');
const q = require('../../../lib/mapping/q').q;
describe('Cache', function() {
this.timeout(5000);
describe('getSelectKey()', () => {
// Use arrays instead of iterators to compare
const getKey = (docKeys, doc, docInfo) => Array.from(Cache.getSelectKey(docKeys, doc, docInfo));
it('should consider docKeys', () => {
const docKeys1 = ['abc', 'def'];
const docKeys2 = ['abc', 'd', 'e', 'f'];
const docKeys3 = ['abc'];
const key1 = getKey(docKeys1, {});
const key2 = getKey(docKeys2, {});
const key3 = getKey(docKeys3, {});
assert.notDeepEqual(key1, key2);
assert.notDeepEqual(key1, key3);
assert.notDeepEqual(key2, key3);
// Same values => same key
assert.deepEqual(key1, getKey(docKeys1.slice(0), {}));
assert.deepEqual(key2, getKey(docKeys2.slice(0), {}));
assert.deepEqual(key3, getKey(docKeys3.slice(0), {}));
});
it('should consider limit, orderBy, fields', () => {
const docKeys1 = ['abc', 'def'];
// Any defined limit
const key1WithLimitA = getKey(docKeys1, {}, { limit: 123 });
const key1WithLimitB = getKey(docKeys1, {}, { limit: 100 });
const key2WithLimit = getKey(['abc', 'd', 'e', 'f'], {}, { limit: 100 });
assert.deepEqual(key1WithLimitA, key1WithLimitB);
assert.notDeepEqual(key1WithLimitA, key2WithLimit);
// orderBy
const key1WithOrderByA = getKey(docKeys1, {}, { orderBy: {'abc': 'asc'} });
const key1WithOrderByB = getKey(docKeys1, {}, { orderBy: {'def': 'desc'} });
const key1WithOrderByC = getKey(docKeys1, {}, { orderBy: {'abc': 'asc'} });
const key1WithOrderByD = getKey(docKeys1, {}, { orderBy: {'abc': 'asc', 'def': 'desc'} });
assert.notDeepEqual(key1WithOrderByA, key1WithOrderByB);
assert.notDeepEqual(key1WithOrderByA, key1WithOrderByD);
assert.deepEqual(key1WithOrderByA, key1WithOrderByC);
// fields
const key1WithFieldsA = getKey(docKeys1, {}, { fields: ['abc'] });
const key1WithFieldsB = getKey(docKeys1, {}, { fields: ['def'] });
const key1WithFieldsC = getKey(docKeys1, {}, { fields: ['abc'] });
const key1WithFieldsD = getKey(docKeys1, {}, { fields: ['abc', 'def'] });
assert.notDeepEqual(key1WithFieldsA, key1WithFieldsB);
assert.notDeepEqual(key1WithFieldsA, key1WithFieldsD);
assert.deepEqual(key1WithFieldsA, key1WithFieldsC);
// Compare fields and orderBy
assert.notDeepEqual(key1WithFieldsA, key1WithOrderByA);
assert.notDeepEqual(key1WithFieldsD, key1WithOrderByD);
});
testQueryOperators(getKey);
testFields(getKey);
});
describe('getUpdateKey()', () => {
const getKey = (docKeys, doc, docInfo) => Array.from(Cache.getUpdateKey(docKeys, doc, docInfo));
testQueryOperators(getKey);
testWhenOperators(getKey);
testFields(getKey);
testDocInfoProperties(getKey, [
{ ifExists: true },
{ ttl: 1000 }
]);
});
describe('getRemoveKey', () => {
const getKey = (docKeys, doc, docInfo) => Array.from(Cache.getRemoveKey(docKeys, doc, docInfo));
testQueryOperators(getKey);
testWhenOperators(getKey);
testFields(getKey);
testDocInfoProperties(getKey, [
{ ifExists: true },
{ deleteOnlyColumns: true }
]);
});
describe('getInsertKey', () => {
const getKey = (docKeys, doc, docInfo) => Array.from(Cache.getInsertKey(docKeys, docInfo));
testFields(getKey);
testDocInfoProperties(getKey, [
{ ifNotExists: true },
{ ttl: 20 }
]);
});
});
function testQueryOperators(getKey) {
it('should consider query operators', () => {
const key1 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: q.lt(10) });
const key2 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: 10 });
assert.notDeepEqual(key1, key2);
});
it('should consider nested query operators', () => {
const key1 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: q.and(1, q.lt(10)) });
const key2 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: q.and(1, 10) });
assert.notDeepEqual(key1, key2);
});
}
function testWhenOperators(getKey) {
it('should consider when condition', () => {
const key1 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 3 }, { when: { prop1: 1, prop2: q.lt(10) }});
const key2 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 3 }, { when: { prop1: 1, prop2: 10 }});
assert.notDeepEqual(key1, key2);
});
it('should consider nested query operators on when conditions', () => {
const key1 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: q.and(1, q.lt(10)) });
const key2 = getKey(['prop1', 'prop2', 'prop3'], { prop1: 1, prop2: q.and(1, 10) });
assert.notDeepEqual(key1, key2);
});
}
function testFields(getKey) {
it('should not collide when including fields', () => {
const key1 = getKey(['prop1', 'prop2'], {});
const key2 = getKey(['prop1'], {}, { fields: ['prop2'] });
const key3 = getKey(['prop1', 'prop2'], {}, { fields: ['prop2'] });
assert.notDeepEqual(key1, key2);
assert.notDeepEqual(key1, key3);
assert.notDeepEqual(key2, key3);
});
}
function testDocInfoProperties(getKey, items) {
it('should consider docInfo properties', () => {
items.forEach(docInfo => {
const key = getKey(['prop1'], { prop1: 1}, docInfo);
// Compare to a key without docInfo
assert.notDeepEqual(key, getKey(['prop1'], { prop1: 1}, undefined));
// Compare to each other
items.forEach(compareDocInfo => {
if (compareDocInfo === docInfo) {
return;
}
assert.notDeepEqual(key, getKey(['prop1'], { prop1: 1}, compareDocInfo));
});
});
});
}