@@ -9,17 +9,22 @@ import (
99 "github.com/specterops/dawgs/cypher/models/pgsql/pgd"
1010)
1111
12- func newPGKindIDMatcher (scope * Scope , treeTranslator * ExpressionTreeTranslator , binding * BoundIdentifier , kindIDs []int16 ) error {
12+ func newPGKindIDMatcher (scope * Scope , treeTranslator * ExpressionTreeTranslator , binding * BoundIdentifier , kindIDs []int16 , isExclusive bool ) error {
1313 kindIDsLiteral := pgsql .NewLiteral (kindIDs , pgsql .Int2Array )
1414
1515 switch binding .DataType {
1616 case pgsql .NodeComposite , pgsql .ExpansionRootNode , pgsql .ExpansionTerminalNode :
1717 treeTranslator .PushOperand (pgd .Column (binding .Identifier , pgsql .ColumnKindIDs ))
1818 treeTranslator .PushOperand (kindIDsLiteral )
1919
20- return treeTranslator .CompleteBinaryExpression (scope , pgsql .OperatorPGArrayLHSContainsRHS )
20+ if isExclusive {
21+ return treeTranslator .CompleteBinaryExpression (scope , pgsql .OperatorPGArrayLHSContainsRHS )
22+ } else {
23+ return treeTranslator .CompleteBinaryExpression (scope , pgsql .OperatorPGArrayOverlap )
24+ }
2125
2226 case pgsql .EdgeComposite , pgsql .ExpansionEdge :
27+ // An edge will only have a single kind_id, so the IsExclusive does not apply here.
2328 treeTranslator .PushOperand (pgsql.CompoundIdentifier {binding .Identifier , pgsql .ColumnKindID })
2429 treeTranslator .PushOperand (pgsql .NewAnyExpressionHinted (kindIDsLiteral ))
2530
@@ -39,6 +44,6 @@ func (s *Translator) translateKindMatcher(kindMatcher *cypher.KindMatcher) error
3944 } else if kindIDs , err := s .kindMapper .MapKinds (kindMatcher .Kinds ); err != nil {
4045 return fmt .Errorf ("failed to translate kinds: %w" , err )
4146 } else {
42- return newPGKindIDMatcher (s .scope , s .treeTranslator , binding , kindIDs )
47+ return newPGKindIDMatcher (s .scope , s .treeTranslator , binding , kindIDs , kindMatcher . IsExclusive )
4348 }
4449}
0 commit comments