Skip to content

Commit bc449e9

Browse files
committed
added sql file for regex
1 parent b6298fe commit bc449e9

File tree

6 files changed

+59
-1
lines changed

6 files changed

+59
-1
lines changed

spec/MongoTransform.spec.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,18 @@ describe('parseObjectToMongoObjectForCreate', () => {
319319
expect(output.ts.iso).toEqual('2017-01-18T00:00:00.000Z');
320320
done();
321321
});
322+
323+
it('$regex in $all list', (done) => {
324+
var input = {
325+
arrayField: {'$all': [{$regex: '^\\Qone\\E'}, {$regex: '^\\Qtwo\\E'}, {$regex: '^\\Qthree\\E'}]},
326+
};
327+
var outputValue = {
328+
arrayField: {'$all': [/^\Qone\E/, /^\Qtwo\E/, /^\Qthree\E/]},
329+
};
330+
var output = transform.transformWhere(null, input);
331+
jequal(outputValue.arrayField, output.arrayField);
332+
done();
333+
});
322334
});
323335

324336
describe('transformUpdate', () => {

spec/ParseQuery.spec.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,31 @@
55
'use strict';
66

77
const Parse = require('parse/node');
8+
const TestObject = Parse.Object.extend('TestObject');
89

910
describe('Parse.Query testing', () => {
11+
it('containsAllStartingWith should match all strings that starts with string', (done) => {
12+
const obj1 = new TestObject({strings: ['the', 'brown', 'lazy', 'fox', 'jumps']});
13+
const obj2 = new TestObject({strings: ['the', 'brown', 'fox', 'jumps']});
14+
const obj3 = new TestObject({strings: ['over', 'the', 'lazy', 'dog']});
15+
Parse.Object.saveAll([obj1, obj2, obj3]).then(() => {
16+
const query = new Parse.Query(TestObject);
17+
const strings = ['the', 'fox', 'lazy'];
18+
return query.containsAllStartingWith('strings', strings).find();
19+
}).then((results) => {
20+
console.log(results);
21+
equal(results.length, 1);
22+
arrayContains(results, obj1);
23+
const query = new Parse.Query(TestObject);
24+
return query.containsAllStartingWith('strings', ['the', 'lazy']).find();
25+
}).then((results) => {
26+
equal(results.length, 2);
27+
arrayContains(results, obj1);
28+
arrayContains(results, obj3);
29+
done();
30+
}, done.fail);
31+
});
32+
1033
it("basic query", function(done) {
1134
var baz = new TestObject({ foo: 'baz' });
1235
var qux = new TestObject({ foo: 'qux' });

src/Adapters/Storage/Mongo/MongoTransform.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,8 @@ const transformInteriorAtom = atom => {
448448
return DateCoder.JSONToDatabase(atom);
449449
} else if (BytesCoder.isValidJSON(atom)) {
450450
return BytesCoder.JSONToDatabase(atom);
451+
} else if (typeof atom === 'object' && atom && atom.$regex !== undefined) {
452+
return new RegExp(atom.$regex);
451453
} else {
452454
return atom;
453455
}

src/Adapters/Storage/Postgres/PostgresStorageAdapter.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,15 @@ const buildWhereClause = ({ schema, query, index }) => {
321321
}
322322

323323
if (Array.isArray(fieldValue.$all) && isArrayField) {
324-
patterns.push(`array_contains_all($${index}:name, $${index + 1}::jsonb)`);
324+
if (fieldValue.$all[0].$regex) {
325+
for (let i = 0; i < fieldValue.$all.length; i += 1) {
326+
const value = processRegexPattern(fieldValue.$all[i].$regex);
327+
fieldValue.$all[i] = value.substring(1) + '%';
328+
}
329+
patterns.push(`array_contains_all_regex($${index}:name, $${index + 1}::jsonb)`);
330+
} else {
331+
patterns.push(`array_contains_all($${index}:name, $${index + 1}::jsonb)`);
332+
}
325333
values.push(fieldName, JSON.stringify(fieldValue.$all));
326334
index += 2;
327335
}
@@ -1288,6 +1296,7 @@ export class PostgresStorageAdapter {
12881296
t.none(sql.array.addUnique),
12891297
t.none(sql.array.remove),
12901298
t.none(sql.array.containsAll),
1299+
t.none(sql.array.containsAllRegex),
12911300
t.none(sql.array.contains)
12921301
]);
12931302
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CREATE OR REPLACE FUNCTION array_contains_all_regex(
2+
"array" jsonb,
3+
"values" jsonb
4+
)
5+
RETURNS boolean
6+
LANGUAGE sql
7+
IMMUTABLE
8+
STRICT
9+
AS $function$
10+
SELECT RES.CNT = jsonb_array_length("values") FROM (SELECT COUNT(*) as CNT FROM jsonb_array_elements_text("array") as elt WHERE elt LIKE ANY (SELECT jsonb_array_elements_text("values"))) as RES;
11+
$function$;

src/Adapters/Storage/Postgres/sql/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module.exports = {
99
addUnique: sql('array/add-unique.sql'),
1010
contains: sql('array/contains.sql'),
1111
containsAll: sql('array/contains-all.sql'),
12+
containsAllRegex: sql('array/contains-all-regex.sql'),
1213
remove: sql('array/remove.sql')
1314
},
1415
misc: {

0 commit comments

Comments
 (0)