aerospike
Version:
Aerospike Client Library
1,329 lines (1,159 loc) • 62.1 kB
JavaScript
// *****************************************************************************
// Copyright 2022-2023 Aerospike, Inc.
//
// Licensed 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'
/* eslint-env mocha */
/* global expect */
const Aerospike = require('../lib/aerospike')
const exp = Aerospike.exp
const maps = Aerospike.maps
const op = Aerospike.operations
const Context = Aerospike.cdt.Context
const helper = require('./test_helper')
const keygen = helper.keygen
const tempBin = 'ExpVar'
const FILTERED_OUT = Aerospike.status.FILTERED_OUT
describe('Aerospike.exp_operations', function () {
helper.skipUnlessVersion('>= 5.0.0', this)
const client = helper.client
async function createRecord (bins, meta = null) {
const key = keygen.string(helper.namespace, helper.set, { prefix: 'test/exp' })()
await client.put(key, bins, meta)
return key
}
async function testNoMatch (key, filterExpression) {
const rejectPolicy = { filterExpression }
let operationSuccessful = false
try {
await client.remove(key, rejectPolicy)
operationSuccessful = true
} catch (error) {
expect(error.code).to.eq(FILTERED_OUT, `Received unexpected error code with message "${error.message}"`)
}
if (operationSuccessful) {
expect.fail('Test no-match: Operation should have not have been executed due to failed expression match')
}
}
async function testMatch (key, filterExpression) {
const passPolicy = { filterExpression }
await client.remove(key, passPolicy)
}
const orderMap = (bin, order, ctx) => {
const policy = new Aerospike.MapPolicy({ order })
const setMapPolicy = maps.setPolicy(bin, policy)
if (ctx) setMapPolicy.withContext(ctx)
return client.operate(setMapPolicy)
}
const orderByKey = (bin, ctx) => orderMap(bin, maps.order.KEY_ORDERED, ctx)
it('builds up a filter expression value', function () {
const filter = exp.eq(exp.binInt('intVal'), exp.int(42))
expect(filter).to.be.an('array')
})
describe('map expressions', function () {
describe('clear', function () {
it('removes all items in a map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.clear(
exp.binMap('tags')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: {} })
})
it('selects item identified by index inside nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.clear(
exp.binMap('tags'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: {} } })
})
})
describe('removeByKey', function () {
it('removes map item by key', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKey(
exp.binMap('tags'),
exp.str('a')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { b: 'green', c: 'yellow' } })
})
it('removes map item by key in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKey(
exp.binMap('tags'),
exp.str('e'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', f: 'white', g: 'black' } } })
})
})
describe('removeByKeyList', function () {
it('removes map item by key list', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyList(
exp.binMap('tags'),
exp.list(['a', 'b'])),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'yellow' } })
})
it('removes map item by key list in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyList(
exp.binMap('tags'),
exp.list(['d', 'e']),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { f: 'white', g: 'black' } } })
})
})
describe('removeByKeyRange', function () {
it('removes map item by key range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRange(
exp.binMap('tags'),
exp.str('c'),
exp.str('a')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'yellow' } })
})
it('removes map item by key range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRange(
exp.binMap('tags'),
exp.str('h'),
exp.str('e'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange' } } })
})
it('removes inverted map item by key range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRange(
exp.binMap('tags'),
exp.str('c'),
exp.str('a'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', b: 'green' } })
})
it('removes inverted map item by key range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRange(
exp.binMap('tags'),
exp.str('h'),
exp.str('e'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', f: 'white', g: 'black' } } })
})
})
describe('removeByKeyRelIndexRangeToEnd', function () {
it('removes map item by key relative index range to end', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('b')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', b: 'green' } })
})
it('removes map item by key relative index range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('e'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink' } } })
})
it('removes inverted map item by key relative index range to end', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('b'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'yellow' } })
})
it('removes inverted map item by key relative index range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('e'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { f: 'white', g: 'black' } } })
})
})
describe('removeByKeyRelIndexRange', function () {
it('removes map item by key relative index range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
exp.str('a')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'yellow' } })
})
it('removes map item by key relative index range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
exp.str('d'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { f: 'white', g: 'black' } } })
})
it('removes inverted map item by key relative index range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
exp.str('a'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', b: 'green' } })
})
it('removes inverted map item by key relative index range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByKeyRelIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
exp.str('a'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink' } } })
})
})
describe('removeByValue', function () {
it('removes map item by value', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValue(
exp.binMap('tags'),
exp.str('green')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', c: 'yellow' } })
})
it('removes map item by value in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValue(
exp.binMap('tags'),
exp.str('white'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', g: 'black' } } })
})
})
describe('removeByValueList', function () {
it('removes map item by value list', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueList(
exp.binMap('tags'),
exp.list(['green', 'yellow'])),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue' } })
})
it('removes map item by value list in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueList(
exp.binMap('tags'),
exp.list(['orange', 'white']),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', g: 'black' } } })
})
})
describe('removeByValueRange', function () {
it('removes map item by value range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRange(
exp.binMap('tags'),
exp.str('green'),
exp.str('blue')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { b: 'green', c: 'yellow' } })
})
it('removes map item by value range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRange(
exp.binMap('tags'),
exp.str('pink'),
exp.str('black'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', f: 'white' } } })
})
it('removes inverted map item by value range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRange(
exp.binMap('tags'),
exp.str('green'),
exp.str('blue'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue' } })
})
it('removes inverted map item by value range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRange(
exp.binMap('tags'),
exp.str('pink'),
exp.str('black'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', g: 'black' } } })
})
})
describe('removeByValueRelRankRangeToEnd', function () {
it('removes map item by value relative rank range to end', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('blue')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'blue' } })
})
it('removes map item by value relative rank range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('orange'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', g: 'black' } } })
})
it('removes inverted map item by value relative rank range to end', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('blue'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'yellow', b: 'green' } })
})
it('removes inverted map item by value relative rank range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
exp.str('black'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white' } } })
})
})
describe('removeByValueRelRankRange', function () {
it('removes map item by value relative rank range', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRange(
exp.binMap('tags'),
exp.int(1),
exp.int(-1),
exp.str('green')),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'yellow', b: 'green' } })
})
it('removes map item by value relative rank range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRange(
exp.binMap('tags'),
exp.int(1),
exp.int(-1),
exp.str('pink'),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', f: 'white', g: 'black' } } })
})
it('removes inverted map item by value relative rank range', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRange(
exp.binMap('tags'),
exp.int(1),
exp.int(-1),
exp.str('green'),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'blue' } })
})
it('removes inverted map item by value relative rank range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByValueRelRankRange(
exp.binMap('tags'),
exp.int(1),
exp.int(-1),
exp.str('pink'),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange' } } })
})
})
describe('removeByIndex', function () {
it('removes a map item by index', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndex(
exp.binMap('tags'),
exp.int(1)),
0),
op.read('tags')
]
let result = await client.operate(key, ops, {})
result = await client.get(key)
expect(result.bins).to.eql({ tags: { a: 'blue', c: 'yellow' } })
})
it('removes a map item by index in a cdt context in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndex(
exp.binMap('tags'),
exp.int(1),
context),
0),
op.read('tags')
]
let result = await client.operate(key, ops, {})
result = await client.get(key)
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', f: 'white', g: 'black' } } })
})
})
describe('removeByIndexRangeToEnd', function () {
it('removes a map item by index range to end', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1)),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue' } })
})
it('removes a map item by index range to end in a cdt context in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange' } } })
})
it('removes an inverted map item by index range to end', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { b: 'green', c: 'yellow' } })
})
it('removes an inverted map item by index range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(1),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', f: 'white', g: 'black' } } })
})
})
describe('removeByIndexRange', function () {
it('removes a map item by index range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0)),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'yellow' } })
})
it('removes a map item by index range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { f: 'white', g: 'black' } } })
})
it('removes a inverted map item by index range', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', b: 'green' } })
})
it('removes a inverted map item by index range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByIndexRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink' } } })
})
})
describe('removeByRank', function () {
it('removes a map item by rank', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByRank(
exp.binMap('tags'),
exp.int(2)),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { b: 'green', c: 'blue' } })
})
it('removes a map item by rank in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByRank(
exp.binMap('tags'),
exp.int(2),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', f: 'white', g: 'black' } } })
})
})
describe('removeByRankRangeToEnd', function () {
it('removes a map item by rank range to end', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRangeToEnd(
exp.binMap('tags'),
exp.int(1)),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { c: 'blue' } })
})
it('removes a map item by rank range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { g: 'black' } } })
})
it('removes an inverted map item by rank range to end', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'yellow', b: 'green' } })
})
it('removes an inverted map item by rank range to end in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRangeToEnd(
exp.binMap('tags'),
exp.int(1),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white' } } })
})
})
describe('removeByRankRange', function () {
it('removes a map item by rank range', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0)),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'yellow' } })
})
it('removes a map item by rank range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
context),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { e: 'pink', f: 'white' } } })
})
it('removes an inverted map item by rank range', async function () {
const key = await createRecord({ tags: { a: 'yellow', b: 'green', c: 'blue' } })
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
null,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { b: 'green', c: 'blue' } })
})
it('removes an inverted map item by rank range in a cdt context', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.write('tags',
exp.maps.removeByRankRange(
exp.binMap('tags'),
exp.int(2),
exp.int(0),
context,
maps.returnType.INVERTED),
0),
op.read('tags')
]
const result = await client.operate(key, ops, {})
expect(result.bins).to.eql({ tags: { a: 'blue', nested: { d: 'orange', g: 'black' } } })
})
})
describe('getByIndex', function () {
it('selects item identified by index', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
const ops = [
exp.operations.read(tempBin,
exp.maps.getByIndex(
exp.binMap('tags'),
exp.int(2),
exp.type.INT,
maps.returnType.COUNT),
0),
op.read('tags')
]
await client.operate(key, ops, {})
await testNoMatch(key, exp.eq(
exp.maps.getByIndex(
exp.binMap('tags'),
exp.int(2),
exp.type.INT,
maps.returnType.COUNT),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndex(
exp.binMap('tags'),
exp.int(2),
exp.type.INT,
maps.returnType.COUNT),
exp.int(1)))
})
it('selects item identified by index inside nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
orderByKey('tags')
orderByKey('tags', context)
await testNoMatch(key, exp.eq(
exp.maps.getByIndex(
exp.binMap('tags'),
exp.int(2),
exp.type.AUTO,
maps.returnType.COUNT,
context),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndex(
exp.binMap('tags'),
exp.int(3),
exp.type.AUTO,
maps.returnType.COUNT,
context),
exp.int(1)))
})
})
describe('getByIndexRange', function () {
it('selects "count" map items starting at specified index', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
await testNoMatch(key, exp.eq(
exp.maps.getByIndexRange(
exp.binMap('tags'),
exp.int(5),
exp.int(0),
maps.returnType.COUNT),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndexRange(
exp.binMap('tags'),
exp.int(5),
exp.int(0),
maps.returnType.COUNT),
exp.int(3)))
})
it('selects "count" map items starting at specified nested index', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
orderByKey('tags')
orderByKey('tags', context)
await testNoMatch(key, exp.eq(
exp.maps.getByIndexRange(
exp.binMap('tags'),
exp.int(6),
exp.int(0),
maps.returnType.COUNT,
context),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndexRange(
exp.binMap('tags'),
exp.int(6),
exp.int(0),
maps.returnType.COUNT,
context),
exp.int(4)))
})
})
describe('getByIndexRangeToEnd', function () {
it('selects map items starting at specified index to the end of the map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
await testNoMatch(key, exp.eq(
exp.maps.getByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(0),
maps.returnType.COUNT),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(0),
maps.returnType.COUNT),
exp.int(3)))
})
it('selects map items starting at specified index to the end of the map', async function () {
const key = await createRecord({ tags: { a: 'blue', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
orderByKey('tags')
orderByKey('tags', context)
await testNoMatch(key, exp.eq(
exp.maps.getByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(0),
maps.returnType.COUNT,
context),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByIndexRangeToEnd(
exp.binMap('tags'),
exp.int(0),
maps.returnType.COUNT,
context),
exp.int(4)))
})
})
describe('getByKey', function () {
it('matches the count of the matched map values', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
await testNoMatch(key, exp.eq(exp.maps.getByKey(exp.binMap('tags'), exp.str('a'), exp.type.AUTO, maps.returnType.COUNT), exp.int(2)))
await testMatch(key, exp.eq(exp.maps.getByKey(exp.binMap('tags'), exp.str('a'), exp.type.AUTO, maps.returnType.COUNT), exp.int(1)))
})
it('matches the count of the matched map values of a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
await testNoMatch(key, exp.eq(exp.maps.getByKey(exp.binMap('tags'), exp.str('d'), exp.type.AUTO, maps.returnType.COUNT, context), exp.int(2)))
await testMatch(key, exp.eq(exp.maps.getByKey(exp.binMap('tags'), exp.str('d'), exp.type.AUTO, maps.returnType.COUNT, context), exp.int(1)))
})
})
describe('getByKeyList', function () {
it('matches the count of the matched map values', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
await testNoMatch(key, exp.eq(exp.maps.getByKeyList(exp.binMap('tags'), exp.list(['a', 'b']), maps.returnType.COUNT), exp.int(1)))
await testMatch(key, exp.eq(exp.maps.getByKeyList(exp.binMap('tags'), exp.list(['a', 'b']), maps.returnType.COUNT), exp.int(2)))
})
it('matches the count of the matched map values of a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
await testNoMatch(key, exp.eq(exp.maps.getByKeyList(exp.binMap('tags'), exp.list(['d', 'e']), maps.returnType.COUNT, context), exp.int(1)))
await testMatch(key, exp.eq(exp.maps.getByKeyList(exp.binMap('tags'), exp.list(['d', 'e']), maps.returnType.COUNT, context), exp.int(2)))
})
})
describe('getByKeyRange', function () {
it('matches the count of the matched map values', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow' } })
await testNoMatch(key, exp.eq(exp.maps.getByKeyRange(exp.binMap('tags'), exp.str('c'), exp.str('a'), maps.returnType.COUNT), exp.int(3)))
await testMatch(key, exp.eq(exp.maps.getByKeyRange(exp.binMap('tags'), exp.str('c'), exp.str('a'), maps.returnType.COUNT), exp.int(2)))
})
it('matches the count of the matched map values of a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
await testNoMatch(key, exp.eq(exp.maps.getByKeyRange(exp.binMap('tags'), exp.str('g'), exp.str('d'), maps.returnType.COUNT, context), exp.int(4)))
await testMatch(key, exp.eq(exp.maps.getByKeyRange(exp.binMap('tags'), exp.str('g'), exp.str('d'), maps.returnType.COUNT, context), exp.int(3)))
})
})
describe('getByKeyRelIndexRange', function () {
it('matches the count of the matched map values', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', d: 'yellow' } })
await testNoMatch(key, exp.eq(exp.maps.getByKeyRelIndexRange(exp.binMap('tags'), exp.int(3), exp.int(0), exp.str('b'), maps.returnType.COUNT), exp.int(1)))
await testMatch(key, exp.eq(exp.maps.getByKeyRelIndexRange(exp.binMap('tags'), exp.int(3), exp.int(0), exp.str('b'), maps.returnType.COUNT), exp.int(2)))
})
it('matches the count of the matched map values of a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow', nested: { d: 'orange', e: 'pink', g: 'white', h: 'black' } } })
const context = new Context().addMapKey('nested')
await testNoMatch(key, exp.eq(exp.maps.getByKeyRelIndexRange(exp.binMap('tags'), exp.int(3), exp.int(0), exp.str('g'), maps.returnType.COUNT, context), exp.int(1)))
await testMatch(key, exp.eq(exp.maps.getByKeyRelIndexRange(exp.binMap('tags'), exp.int(3), exp.int(0), exp.str('g'), maps.returnType.COUNT, context), exp.int(2)))
})
})
describe('getByKeyRelIndexRangeToEnd', function () {
it('matches the count of the matched map values', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', d: 'yellow' } })
await testNoMatch(key, exp.eq(exp.maps.getByKeyRelIndexRangeToEnd(exp.binMap('tags'), exp.int(0), exp.str('b'), maps.returnType.COUNT), exp.int(1)))
await testMatch(key, exp.eq(exp.maps.getByKeyRelIndexRangeToEnd(exp.binMap('tags'), exp.int(0), exp.str('b'), maps.returnType.COUNT), exp.int(2)))
})
it('matches the count of the matched map values of a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', c: 'yellow', nested: { d: 'orange', e: 'pink', g: 'white', h: 'black' } } })
const context = new Context().addMapKey('nested')
await testNoMatch(key, exp.eq(exp.maps.getByKeyRelIndexRangeToEnd(exp.binMap('tags'), exp.int(0), exp.str('e'), maps.returnType.COUNT, context), exp.int(2)))
await testMatch(key, exp.eq(exp.maps.getByKeyRelIndexRangeToEnd(exp.binMap('tags'), exp.int(0), exp.str('e'), maps.returnType.COUNT, context), exp.int(3)))
})
})
describe('getByRank', function () {
it('selects map item identified by rank', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', d: 5, c: 'yellow' } })
const ops = [
exp.operations.read(tempBin,
exp.maps.getByRank(
exp.binMap('tags'),
exp.int(0),
exp.type.INT,
maps.returnType.COUNT),
0),
op.read('tags')
]
await client.operate(key, ops, {})
await testNoMatch(key, exp.eq(
exp.maps.getByRank(
exp.binMap('tags'),
exp.int(0),
exp.type.INT,
maps.returnType.COUNT),
exp.int(0)))
await testMatch(key, exp.eq(
exp.maps.getByRank(
exp.binMap('tags'),
exp.int(0),
exp.type.INT,
maps.returnType.COUNT),
exp.int(1)))
})
it('selects map item identified by rank within a nested map', async function () {
const key = await createRecord({ tags: { a: 'blue', b: 'green', d: 5, c: 'yellow', nested: { d: 'orange', e: 'pink', f: 'white', g: 'black' } } })
const context = new Context().addMapKey('nested')
const ops = [
exp.operations.read(tempBin,
exp.maps.getByRank(
exp.binMap('tags'),
exp.int(0),
exp.type.INT,
maps.returnType.COUNT),
0),