@@ -80,24 +80,8 @@ public static AstExpression Add(params AstExpression[] args)
80
80
return new AstConstantExpression ( value ) ;
81
81
}
82
82
83
- if ( args . Any ( arg => arg is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Add ) )
84
- {
85
- var flattenedArgs = new List < AstExpression > ( ) ;
86
- foreach ( var arg in args )
87
- {
88
- if ( arg is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Add )
89
- {
90
- flattenedArgs . AddRange ( naryExpression . Args ) ;
91
- }
92
- else
93
- {
94
- flattenedArgs . Add ( arg ) ;
95
- }
96
- }
97
- return new AstNaryExpression ( AstNaryOperator . Add , flattenedArgs ) ;
98
- }
99
-
100
- return new AstNaryExpression ( AstNaryOperator . Add , args ) ;
83
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . Add ) ;
84
+ return new AstNaryExpression ( AstNaryOperator . Add , flattenedArgs ) ;
101
85
}
102
86
103
87
public static AstExpression AllElementsTrue ( AstExpression array )
@@ -122,24 +106,8 @@ public static AstExpression And(params AstExpression[] args)
122
106
return new AstConstantExpression ( value ) ;
123
107
}
124
108
125
- if ( args . Any ( arg => arg . NodeType == AstNodeType . AndExpression ) )
126
- {
127
- var flattenedArgs = new List < AstExpression > ( ) ;
128
- foreach ( var arg in args )
129
- {
130
- if ( arg is AstAndExpression andExpression )
131
- {
132
- flattenedArgs . AddRange ( andExpression . Args ) ;
133
- }
134
- else
135
- {
136
- flattenedArgs . Add ( arg ) ;
137
- }
138
- }
139
- return new AstAndExpression ( flattenedArgs ) ;
140
- }
141
-
142
- return new AstAndExpression ( args ) ;
109
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . And ) ;
110
+ return new AstNaryExpression ( AstNaryOperator . And , flattenedArgs ) ;
143
111
}
144
112
145
113
public static AstExpression ArrayElemAt ( AstExpression array , AstExpression index )
@@ -162,6 +130,42 @@ public static AstExpression BinaryWindowExpression(AstBinaryWindowOperator @oper
162
130
return new AstBinaryWindowExpression ( @operator , arg1 , arg2 , window ) ;
163
131
}
164
132
133
+ public static AstExpression BitAnd ( params AstExpression [ ] args )
134
+ {
135
+ Ensure . IsNotNull ( args , nameof ( args ) ) ;
136
+ Ensure . That ( args . Length > 0 , "args cannot be empty." , nameof ( args ) ) ;
137
+ Ensure . That ( ! args . Contains ( null ) , "args cannot contain null." , nameof ( args ) ) ;
138
+
139
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . BitAnd ) ;
140
+ return new AstNaryExpression ( AstNaryOperator . BitAnd , flattenedArgs ) ;
141
+ }
142
+
143
+ public static AstExpression BitNot ( AstExpression arg )
144
+ {
145
+ Ensure . IsNotNull ( arg , nameof ( arg ) ) ;
146
+ return new AstUnaryExpression ( AstUnaryOperator . BitNot , arg ) ;
147
+ }
148
+
149
+ public static AstExpression BitOr ( params AstExpression [ ] args )
150
+ {
151
+ Ensure . IsNotNull ( args , nameof ( args ) ) ;
152
+ Ensure . That ( args . Length > 0 , "args cannot be empty." , nameof ( args ) ) ;
153
+ Ensure . That ( ! args . Contains ( null ) , "args cannot contain null." , nameof ( args ) ) ;
154
+
155
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . BitOr ) ;
156
+ return new AstNaryExpression ( AstNaryOperator . BitOr , flattenedArgs ) ;
157
+ }
158
+
159
+ public static AstExpression BitXor ( params AstExpression [ ] args )
160
+ {
161
+ Ensure . IsNotNull ( args , nameof ( args ) ) ;
162
+ Ensure . That ( args . Length > 0 , "args cannot be empty." , nameof ( args ) ) ;
163
+ Ensure . That ( ! args . Contains ( null ) , "args cannot contain null." , nameof ( args ) ) ;
164
+
165
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . BitXor ) ;
166
+ return new AstNaryExpression ( AstNaryOperator . BitXor , flattenedArgs ) ;
167
+ }
168
+
165
169
public static AstExpression Ceil ( AstExpression arg )
166
170
{
167
171
return new AstUnaryExpression ( AstUnaryOperator . Ceil , arg ) ;
@@ -213,24 +217,8 @@ public static IEnumerable<AstComputedField> ComputedFields(params (string name,
213
217
214
218
public static AstExpression Concat ( params AstExpression [ ] args )
215
219
{
216
- if ( args . Any ( a => a is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Concat ) )
217
- {
218
- var flattenedArgs = new List < AstExpression > ( ) ;
219
- foreach ( var arg in args )
220
- {
221
- if ( arg is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Concat )
222
- {
223
- flattenedArgs . AddRange ( naryExpression . Args ) ;
224
- }
225
- else
226
- {
227
- flattenedArgs . Add ( arg ) ;
228
- }
229
- }
230
- return new AstNaryExpression ( AstNaryOperator . Concat , flattenedArgs ) ;
231
- }
232
-
233
- return new AstNaryExpression ( AstNaryOperator . Concat , args ) ;
220
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . Concat ) ;
221
+ return new AstNaryExpression ( AstNaryOperator . Concat , flattenedArgs ) ;
234
222
}
235
223
236
224
public static AstExpression ConcatArrays ( params AstExpression [ ] arrays )
@@ -568,25 +556,8 @@ public static AstExpression Mod(AstExpression arg1, AstExpression arg2)
568
556
569
557
public static AstExpression Multiply ( params AstExpression [ ] args )
570
558
{
571
- if ( args . Any ( arg => arg is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Multiply ) )
572
- {
573
- var flattenedArgs = new List < AstExpression > ( ) ;
574
- foreach ( var arg in args )
575
- {
576
- if ( arg is AstNaryExpression naryExpression && naryExpression . Operator == AstNaryOperator . Multiply )
577
- {
578
- flattenedArgs . AddRange ( naryExpression . Args ) ;
579
- }
580
- else
581
- {
582
- flattenedArgs . Add ( arg ) ;
583
- }
584
- }
585
- return new AstNaryExpression ( AstNaryOperator . Multiply , flattenedArgs ) ;
586
- }
587
-
588
-
589
- return new AstNaryExpression ( AstNaryOperator . Multiply , args ) ;
559
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . Multiply ) ;
560
+ return new AstNaryExpression ( AstNaryOperator . Multiply , flattenedArgs ) ;
590
561
}
591
562
592
563
public static AstExpression Ne ( AstExpression arg1 , AstExpression arg2 )
@@ -610,24 +581,8 @@ public static AstExpression Or(params AstExpression[] args)
610
581
Ensure . That ( args . Length > 0 , "args cannot be empty." , nameof ( args ) ) ;
611
582
Ensure . That ( ! args . Contains ( null ) , "args cannot contain null." , nameof ( args ) ) ;
612
583
613
- if ( args . Any ( a => a . NodeType == AstNodeType . OrExpression ) )
614
- {
615
- var flattenedArgs = new List < AstExpression > ( ) ;
616
- foreach ( var arg in args )
617
- {
618
- if ( arg is AstOrExpression orExpression )
619
- {
620
- flattenedArgs . AddRange ( orExpression . Args ) ;
621
- }
622
- else
623
- {
624
- flattenedArgs . Add ( arg ) ;
625
- }
626
- }
627
- return new AstOrExpression ( flattenedArgs ) ;
628
- }
629
-
630
- return new AstOrExpression ( args ) ;
584
+ var flattenedArgs = FlattenNaryArgs ( args , AstNaryOperator . Or ) ;
585
+ return new AstNaryExpression ( AstNaryOperator . Or , flattenedArgs ) ;
631
586
}
632
587
633
588
public static AstExpression PickExpression ( AstPickOperator @operator , AstExpression source , AstSortFields sortBy , AstVarExpression @as , AstExpression selector , AstExpression n )
@@ -951,6 +906,28 @@ private static bool AllArgsAreConstantInt32s(AstExpression[] args, out List<int>
951
906
values = null ;
952
907
return false ;
953
908
}
909
+
910
+ private static IEnumerable < AstExpression > FlattenNaryArgs ( IEnumerable < AstExpression > args , AstNaryOperator naryOperator )
911
+ {
912
+ if ( args . Any ( arg => arg is AstNaryExpression naryExpression && naryExpression . Operator == naryOperator ) )
913
+ {
914
+ var flattenedArgs = new List < AstExpression > ( ) ;
915
+ foreach ( var arg in args )
916
+ {
917
+ if ( arg is AstNaryExpression naryExpression && naryExpression . Operator == naryOperator )
918
+ {
919
+ flattenedArgs . AddRange ( naryExpression . Args ) ;
920
+ }
921
+ else
922
+ {
923
+ flattenedArgs . Add ( arg ) ;
924
+ }
925
+ }
926
+ return flattenedArgs ;
927
+ }
928
+
929
+ return args ;
930
+ }
954
931
#endregion static
955
932
956
933
// public methods
0 commit comments