@@ -38,23 +38,23 @@ public final class OperatorExpression {
3838 add (new OperatorExpression (Operator .Dot , 1 , false , BINARY ));
3939 add (new OperatorExpression (Operator .DoubleColon , 2 , true , BINARY ));
4040 // arithmetic operators, UnaryMinus and UnaryComplement defined above are strongest from this block
41- add (new OperatorExpression (Operator .Multiplication , 3 , true , BINARY ));
41+ add (new OperatorExpression (Operator .Multiplication , 3 , true , BINARY , true , true , true ));
4242 add (new OperatorExpression (Operator .Division , 3 , true , BINARY ));
4343 add (new OperatorExpression (Operator .Modulo , 3 , true , BINARY ));
4444
45- add (new OperatorExpression (Operator .Plus , 4 , true , BINARY ));
45+ add (new OperatorExpression (Operator .Plus , 4 , true , BINARY , true , true , true ));
4646 add (new OperatorExpression (Operator .Minus , 4 , true , BINARY ));
4747 // IP operators
4848 add (new OperatorExpression (Operator .IpContainsStrictLeft , 4 , true , BINARY ));
4949 add (new OperatorExpression (Operator .IpContainsStrictRight , 4 , true , BINARY ));
5050 add (new OperatorExpression (Operator .IpContainsLeft , 4 , true , BINARY ));
5151 add (new OperatorExpression (Operator .IpContainsRight , 4 , true , BINARY ));
5252 // concatenation
53- add (new OperatorExpression (Operator .Concatenation , 5 , true , BINARY ));
53+ add (new OperatorExpression (Operator .Concatenation , 5 , true , BINARY , true , true , false ));
5454 // bitwise operators
55- add (new OperatorExpression (Operator .BitAnd , 8 , true , BINARY ));
56- add (new OperatorExpression (Operator .BitXor , 9 , true , BINARY ));
57- add (new OperatorExpression (Operator .BitOr , 10 , true , BINARY ));
55+ add (new OperatorExpression (Operator .BitAnd , 8 , true , BINARY , true , true , true ));
56+ add (new OperatorExpression (Operator .BitXor , 9 , true , BINARY , true , true , true ));
57+ add (new OperatorExpression (Operator .BitOr , 10 , true , BINARY , true , true , true ));
5858 // set operators
5959 add (new OperatorExpression (Operator .In , 7 , true , SET , false ));
6060 add (new OperatorExpression (Operator .Between , 7 , true , SET , false )); // ternary operator
@@ -73,8 +73,8 @@ public final class OperatorExpression {
7373 add (new OperatorExpression (Operator .ILikeSqlStyle , 7 , true , BINARY , false ));
7474 // logical operators
7575 add (new OperatorExpression (Operator .BinaryNot , 11 , true , UNARY , false ));
76- add (new OperatorExpression (Operator .BinaryAnd , 11 , true , BINARY , false ));
77- add (new OperatorExpression (Operator .BinaryOr , 11 , true , BINARY , false ));
76+ add (new OperatorExpression (Operator .BinaryAnd , 11 , true , BINARY , false , true , true ));
77+ add (new OperatorExpression (Operator .BinaryOr , 11 , true , BINARY , false , true , true ));
7878 }});
7979 private static final OperatorRegistry registry = new OperatorRegistry (
8080 new ObjList <>() {{
@@ -85,22 +85,22 @@ public final class OperatorExpression {
8585 add (new OperatorExpression (Operator .Dot , 1 , false , BINARY ));
8686 add (new OperatorExpression (Operator .DoubleColon , 2 , true , BINARY ));
8787 // arithmetic operators, UnaryMinus and UnaryComplement defined above are strongest from this block
88- add (new OperatorExpression (Operator .Multiplication , 4 , true , BINARY ));
88+ add (new OperatorExpression (Operator .Multiplication , 4 , true , BINARY , true , true , true ));
8989 add (new OperatorExpression (Operator .Division , 4 , true , BINARY ));
9090 add (new OperatorExpression (Operator .Modulo , 4 , true , BINARY ));
91- add (new OperatorExpression (Operator .Plus , 5 , true , BINARY ));
91+ add (new OperatorExpression (Operator .Plus , 5 , true , BINARY , true , true , true ));
9292 add (new OperatorExpression (Operator .Minus , 5 , true , BINARY ));
9393 // IP operators
9494 add (new OperatorExpression (Operator .IpContainsStrictLeft , 6 , true , BINARY ));
9595 add (new OperatorExpression (Operator .IpContainsStrictRight , 6 , true , BINARY ));
9696 add (new OperatorExpression (Operator .IpContainsLeft , 6 , true , BINARY ));
9797 add (new OperatorExpression (Operator .IpContainsRight , 6 , true , BINARY ));
9898 // concatenation
99- add (new OperatorExpression (Operator .Concatenation , 7 , true , BINARY ));
99+ add (new OperatorExpression (Operator .Concatenation , 7 , true , BINARY , true , true , false ));
100100 // bitwise operators
101- add (new OperatorExpression (Operator .BitAnd , 8 , true , BINARY ));
102- add (new OperatorExpression (Operator .BitXor , 9 , true , BINARY ));
103- add (new OperatorExpression (Operator .BitOr , 10 , true , BINARY ));
101+ add (new OperatorExpression (Operator .BitAnd , 8 , true , BINARY , true , true , true ));
102+ add (new OperatorExpression (Operator .BitXor , 9 , true , BINARY , true , true , true ));
103+ add (new OperatorExpression (Operator .BitOr , 10 , true , BINARY , true , true , true ));
104104 // set operators
105105 add (new OperatorExpression (Operator .In , 11 , false , SET , false ));
106106 add (new OperatorExpression (Operator .Between , 11 , false , SET , false )); // ternary operator
@@ -119,30 +119,34 @@ public final class OperatorExpression {
119119 add (new OperatorExpression (Operator .ILikeSqlStyle , 13 , true , BINARY , false ));
120120 // logical operators
121121 add (new OperatorExpression (Operator .BinaryNot , 14 , false , UNARY , false ));
122- add (new OperatorExpression (Operator .BinaryAnd , 15 , true , BINARY , false ));
123- add (new OperatorExpression (Operator .BinaryOr , 16 , true , BINARY , false ));
122+ add (new OperatorExpression (Operator .BinaryAnd , 15 , true , BINARY , false , true , true ));
123+ add (new OperatorExpression (Operator .BinaryOr , 16 , true , BINARY , false , true , true ));
124124 add (new OperatorExpression (Operator .Colon , 17 , false , BINARY ));
125125 }});
126+ final boolean associative ;
127+ final boolean commutative ;
126128 final boolean leftAssociative ;
127129 final OperatorExpression .Operator operator ;
128130 final int precedence ;
129131 final boolean symbol ;
130132 final int type ;
131133
132134 private OperatorExpression (OperatorExpression .Operator operator , int precedence , boolean leftAssociative , int type , boolean symbol ) {
133- this .operator = operator ;
134- this .precedence = precedence ;
135- this .leftAssociative = leftAssociative ;
136- this .type = type ;
137- this .symbol = symbol ;
135+ this (operator , precedence , leftAssociative , type , symbol , false , false );
138136 }
139137
140138 private OperatorExpression (OperatorExpression .Operator operator , int precedence , boolean leftAssociative , int type ) {
139+ this (operator , precedence , leftAssociative , type , true , false , false );
140+ }
141+
142+ private OperatorExpression (OperatorExpression .Operator operator , int precedence , boolean leftAssociative , int type , boolean symbol , boolean associative , boolean commutative ) {
141143 this .operator = operator ;
142144 this .precedence = precedence ;
143145 this .leftAssociative = leftAssociative ;
144146 this .type = type ;
145- this .symbol = true ;
147+ this .symbol = symbol ;
148+ this .associative = associative ;
149+ this .commutative = commutative ;
146150 }
147151
148152 public static OperatorRegistry chooseRegistry (boolean cairoSqlLegacyOperatorPrecedence ) {
@@ -157,12 +161,20 @@ public static OperatorRegistry getRegistry() {
157161 return registry ;
158162 }
159163
164+ public String getToken () {
165+ return operator .token ;
166+ }
167+
160168 public int getType () {
161169 return type ;
162170 }
163171
164- public String getToken () {
165- return operator .token ;
172+ public boolean isAssociative () {
173+ return associative ;
174+ }
175+
176+ public boolean isCommutative () {
177+ return commutative ;
166178 }
167179
168180 public boolean greaterPrecedence (int otherPrecedence ) {
0 commit comments