Skip to content

Commit

Permalink
Add EqualAny node
Browse files Browse the repository at this point in the history
Change-type: minor
  • Loading branch information
otaviojacobi committed Jan 22, 2025
1 parent 01883b8 commit 79d5bce
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/AbstractSQLCompiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export type DurationTypeNodes = StrictDurationTypeNodes | UnknownTypeNodes;

export type BooleanNode = ['Boolean', boolean];
export type EqualsNode = ['Equals', AnyTypeNodes, AnyTypeNodes];
export type EqualsAnyNode = ['EqualsAny', AnyTypeNodes, BindNode];
export type NotEqualsNode = ['NotEquals', AnyTypeNodes, AnyTypeNodes];
export type IsDistinctFromNode = ['IsDistinctFrom', AnyTypeNodes, AnyTypeNodes];
export type IsNotDistinctFromNode = [
Expand Down Expand Up @@ -89,6 +90,7 @@ export type ContainsNode = ['Contains', TextTypeNodes, TextTypeNodes];
export type StrictBooleanTypeNodes =
| BooleanNode
| EqualsNode
| EqualsAnyNode
| NotEqualsNode
| IsDistinctFromNode
| IsNotDistinctFromNode
Expand Down Expand Up @@ -246,6 +248,7 @@ export type UnknownTypeNodes =
| NullNode
| FieldNode
| ReferencedFieldNode
| EqualsAnyNode
| BindNode
| CastNode
| CaseNode
Expand Down
3 changes: 3 additions & 0 deletions src/AbstractSQLOptimiser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ import type {
FromTypeNode,
StartsWithNode,
EscapeForLikeNode,
EqualsAnyNode,
} from './AbstractSQLCompiler';
import * as AbstractSQLRules2SQL from './AbstractSQLRules2SQL';

Expand Down Expand Up @@ -219,6 +220,7 @@ const UnknownValue: MetaMatchFn<UnknownTypeNodes> = (args) => {
case 'Null':
case 'Field':
case 'ReferencedField':
case 'EqualsAny':
case 'Bind':
case 'Cast':
case 'Coalesce':
Expand Down Expand Up @@ -739,6 +741,7 @@ const typeRules = {
}),
Comparison<EqualsNode>('Equals'),
),
EqualsAny: matchArgs<EqualsAnyNode>('EqualsAny', AnyValue, AnyValue),
NotEquals: tryMatches<NotEqualsNode | ExistsNode>(
Helper<OptimisationMatchFn<ExistsNode>>((args) => {
checkArgs('NotEquals', args, 2);
Expand Down
6 changes: 6 additions & 0 deletions src/AbstractSQLRules2SQL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ const UnknownValue: MetaMatchFn = (args, indent) => {
case 'Null':
case 'Field':
case 'ReferencedField':
case 'EqualsAny':
case 'Bind':
case 'Cast':
case 'Coalesce':
Expand Down Expand Up @@ -246,6 +247,7 @@ export const isNotNullable = (node: AbstractSqlType): boolean => {
case 'Integer':
case 'IsDistinctFrom':
case 'IsNotDistinctFrom':
case 'EqualsAny':
case 'Exists':
case 'NotExists':
return true;
Expand Down Expand Up @@ -1000,6 +1002,10 @@ const typeRules: Dictionary<MatchFn> = {
return `COALESCE(JSON_AGG(${field}), '[]')`;
},
Equals: Comparison('Equals'),
EqualsAny: (args, indent) => {
checkArgs('EqualsAny', args, 2);
return `${AnyValue(getAbstractSqlQuery(args, 0), indent)} = ANY(${AnyValue(getAbstractSqlQuery(args, 1), indent)})`;
},
GreaterThan: Comparison('GreaterThan'),
GreaterThanOrEqual: Comparison('GreaterThanOrEqual'),
LessThan: Comparison('LessThan'),
Expand Down
12 changes: 12 additions & 0 deletions test/abstract-sql/comparisons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,18 @@ describe('Between', () => {
);
});

describe('Equals Any', () => {
test(
['SelectQuery', ['Select', [['EqualsAny', ['Number', 5], ['Bind', 0]]]]],
[['Bind', 0]],
(result, sqlEquals) => {
it('should produce a valid EqualsAny statement', () => {
sqlEquals(result.query, 'SELECT 5 = ANY($1)');
});
},
);
});

describe('Comparison Operator Precedence', () => {
// Different precedence
test(
Expand Down

0 comments on commit 79d5bce

Please sign in to comment.