Skip to content

Commit

Permalink
feat: add failing test for list append/prepend with list (#9303)
Browse files Browse the repository at this point in the history
* feat: add failing test for list append/prepend with list

* feat: mongo/psql

* feat: improve test
  • Loading branch information
barisusakli committed Feb 14, 2021
1 parent b5b9276 commit 8f0386d
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 25 deletions.
34 changes: 28 additions & 6 deletions src/database/mongo/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,23 @@ module.exports = function (module) {
if (!key) {
return;
}

value = helpers.valueToString(value);

value = Array.isArray(value) ? value : [value];
value = value.map(helpers.valueToString);
value.reverse();
const exists = await module.isObjectField(key, 'array');
if (exists) {
await module.client.collection('objects').updateOne({ _key: key }, { $push: { array: { $each: [value], $position: 0 } } }, { upsert: true });
await module.client.collection('objects').updateOne({
_key: key,
}, {
$push: {
array: {
$each: value,
$position: 0,
},
},
}, {
upsert: true,
});
} else {
await module.listAppend(key, value);
}
Expand All @@ -22,8 +33,19 @@ module.exports = function (module) {
if (!key) {
return;
}
value = helpers.valueToString(value);
await module.client.collection('objects').updateOne({ _key: key }, { $push: { array: value } }, { upsert: true });
value = Array.isArray(value) ? value : [value];
value = value.map(helpers.valueToString);
await module.client.collection('objects').updateOne({
_key: key,
}, {
$push: {
array: {
$each: value,
},
},
}, {
upsert: true,
});
};

module.listRemoveLast = async function (key) {
Expand Down
60 changes: 41 additions & 19 deletions src/database/postgres/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,57 @@ module.exports = function (module) {
}

await module.transaction(async (client) => {
async function doPrepend(value) {
await client.query({
name: 'listPrepend',
text: `
INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT])
ON CONFLICT ("_key")
DO UPDATE SET "array" = ARRAY[$2::TEXT] || "legacy_list"."array"`,
values: [key, value],
});
}

await helpers.ensureLegacyObjectType(client, key, 'list');
await client.query({
name: 'listPrepend',
text: `
INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT])
ON CONFLICT ("_key")
DO UPDATE SET "array" = ARRAY[$2::TEXT] || "legacy_list"."array"`,
values: [key, value],
});
if (Array.isArray(value)) {
// TODO: perf make single query
for (const v of value) {
// eslint-disable-next-line
await doPrepend(v);
}
return;
}
await doPrepend(value);
});
};

module.listAppend = async function (key, value) {
if (!key) {
return;
}

await module.transaction(async (client) => {
async function doAppend(value) {
await client.query({
name: 'listAppend',
text: `
INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT])
ON CONFLICT ("_key")
DO UPDATE SET "array" = "legacy_list"."array" || ARRAY[$2::TEXT]`,
values: [key, value],
});
}
await helpers.ensureLegacyObjectType(client, key, 'list');
await client.query({
name: 'listAppend',
text: `
INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT])
ON CONFLICT ("_key")
DO UPDATE SET "array" = "legacy_list"."array" || ARRAY[$2::TEXT]`,
values: [key, value],
});
if (Array.isArray(value)) {
// TODO: perf make single query
for (const v of value) {
// eslint-disable-next-line
await doAppend(v);
}
return;
}
await doAppend(value);
});
};

Expand Down
20 changes: 20 additions & 0 deletions test/database/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@ describe('List methods', () => {
done();
});
});

it('should append each element to list', async () => {
await db.listAppend('arrayListAppend', ['a', 'b', 'c']);
let values = await db.getListRange('arrayListAppend', 0, -1);
assert.deepStrictEqual(values, ['a', 'b', 'c']);

await db.listAppend('arrayListAppend', ['d', 'e']);
values = await db.getListRange('arrayListAppend', 0, -1);
assert.deepStrictEqual(values, ['a', 'b', 'c', 'd', 'e']);
});
});

describe('listPrepend()', () => {
Expand Down Expand Up @@ -52,6 +62,16 @@ describe('List methods', () => {
done();
});
});

it('should prepend each element to list', async () => {
await db.listPrepend('arrayListPrepend', ['a', 'b', 'c']);
let values = await db.getListRange('arrayListPrepend', 0, -1);
assert.deepStrictEqual(values, ['c', 'b', 'a']);

await db.listPrepend('arrayListPrepend', ['d', 'e']);
values = await db.getListRange('arrayListPrepend', 0, -1);
assert.deepStrictEqual(values, ['e', 'd', 'c', 'b', 'a']);
});
});

describe('getListRange()', () => {
Expand Down

0 comments on commit 8f0386d

Please sign in to comment.