2929import org .apache .calcite .sql .type .SqlTypeName ;
3030import org .apache .calcite .util .DateString ;
3131
32+ import com .google .common .collect .ImmutableList ;
33+
3234import org .checkerframework .checker .nullness .qual .Nullable ;
3335
3436import java .text .SimpleDateFormat ;
4143import static java .util .Objects .requireNonNull ;
4244
4345/**
44- * Translates a {@link RexNode} expression to a Gandiva string .
46+ * Translates a {@link RexNode} expression to Gandiva predicate tokens .
4547 */
4648class ArrowTranslator {
4749 final RexBuilder rexBuilder ;
@@ -65,14 +67,14 @@ public static ArrowTranslator create(RexBuilder rexBuilder,
6567 * If exceeded, the original expression is returned unchanged. */
6668 private static final int MAX_CNF_NODE_COUNT = 256 ;
6769
68- List <List <String >> translateMatch (RexNode condition ) {
70+ List <List <List < String > >> translateMatch (RexNode condition ) {
6971 // Convert to CNF; SEARCH nodes are already expanded
7072 // by ArrowFilterRule before reaching here.
7173 final RexNode cnf = RexUtil .toCnf (rexBuilder , MAX_CNF_NODE_COUNT , condition );
7274
73- final List <List <String >> result = new ArrayList <>();
75+ final List <List <List < String > >> result = new ArrayList <>();
7476 for (RexNode conjunct : RelOptUtil .conjunctions (cnf )) {
75- final List <String > orGroup = new ArrayList <>();
77+ final List <List < String > > orGroup = new ArrayList <>();
7678 for (RexNode disjunct : RelOptUtil .disjunctions (conjunct )) {
7779 orGroup .add (translateMatch2 (disjunct ));
7880 }
@@ -109,9 +111,9 @@ private static Object literalValue(RexLiteral literal) {
109111 *
110112 * @param node A RexNode that always evaluates to a boolean expression.
111113 * Currently, this method is only called from translateAnd.
112- * @return The translated SQL string for the relation.
114+ * @return The translated predicate tokens for the relation.
113115 */
114- private String translateMatch2 (RexNode node ) {
116+ private List < String > translateMatch2 (RexNode node ) {
115117 switch (node .getKind ()) {
116118 case EQUALS :
117119 return translateBinary ("equal" , "=" , (RexCall ) node );
@@ -135,7 +137,7 @@ private String translateMatch2(RexNode node) {
135137 return translateUnary ("isnotfalse" , (RexCall ) node );
136138 case INPUT_REF :
137139 final RexInputRef inputRef = (RexInputRef ) node ;
138- return fieldNames .get (inputRef .getIndex ()) + " istrue" ;
140+ return ImmutableList . of ( fieldNames .get (inputRef .getIndex ()), " istrue") ;
139141 case NOT :
140142 return translateUnary ("isfalse" , (RexCall ) node );
141143 default :
@@ -147,10 +149,10 @@ private String translateMatch2(RexNode node) {
147149 * Translates a call to a binary operator, reversing arguments if
148150 * necessary.
149151 */
150- private String translateBinary (String op , String rop , RexCall call ) {
152+ private List < String > translateBinary (String op , String rop , RexCall call ) {
151153 final RexNode left = call .operands .get (0 );
152154 final RexNode right = call .operands .get (1 );
153- @ Nullable String expression = translateBinary2 (op , left , right );
155+ @ Nullable List < String > expression = translateBinary2 (op , left , right );
154156 if (expression != null ) {
155157 return expression ;
156158 }
@@ -162,7 +164,7 @@ private String translateBinary(String op, String rop, RexCall call) {
162164 }
163165
164166 /** Translates a call to a binary operator. Returns null on failure. */
165- private @ Nullable String translateBinary2 (String op , RexNode left , RexNode right ) {
167+ private @ Nullable List < String > translateBinary2 (String op , RexNode left , RexNode right ) {
166168 if (right .getKind () != SqlKind .LITERAL ) {
167169 return null ;
168170 }
@@ -180,8 +182,8 @@ private String translateBinary(String op, String rop, RexCall call) {
180182 }
181183 }
182184
183- /** Combines a field name, operator, and literal to produce a predicate string . */
184- private String translateOp2 (String op , String name , RexLiteral right ) {
185+ /** Combines a field name, operator, and literal to produce predicate tokens . */
186+ private List < String > translateOp2 (String op , String name , RexLiteral right ) {
185187 Object value = literalValue (right );
186188 String valueString = value .toString ();
187189 String valueType = getLiteralType (right .getType ());
@@ -193,13 +195,13 @@ private String translateOp2(String op, String name, RexLiteral right) {
193195 valueString = "'" + valueString + "'" ;
194196 }
195197 }
196- return name + " " + op + " " + valueString + " " + valueType ;
198+ return ImmutableList . of ( name , op , valueString , valueType ) ;
197199 }
198200
199201 /** Translates a call to a unary operator. */
200- private String translateUnary (String op , RexCall call ) {
202+ private List < String > translateUnary (String op , RexCall call ) {
201203 final RexNode opNode = call .operands .get (0 );
202- @ Nullable String expression = translateUnary2 (op , opNode );
204+ @ Nullable List < String > expression = translateUnary2 (op , opNode );
203205
204206 if (expression != null ) {
205207 return expression ;
@@ -209,7 +211,7 @@ private String translateUnary(String op, RexCall call) {
209211 }
210212
211213 /** Translates a call to a unary operator. Returns null on failure. */
212- private @ Nullable String translateUnary2 (String op , RexNode opNode ) {
214+ private @ Nullable List < String > translateUnary2 (String op , RexNode opNode ) {
213215 if (opNode .getKind () == SqlKind .INPUT_REF ) {
214216 final RexInputRef inputRef = (RexInputRef ) opNode ;
215217 final String name = fieldNames .get (inputRef .getIndex ());
@@ -219,9 +221,9 @@ private String translateUnary(String op, RexCall call) {
219221 return null ;
220222 }
221223
222- /** Combines a field name and a unary operator to produce a predicate string . */
223- private static String translateUnaryOp (String op , String name ) {
224- return name + " " + op ;
224+ /** Combines a field name and a unary operator to produce predicate tokens . */
225+ private static List < String > translateUnaryOp (String op , String name ) {
226+ return ImmutableList . of ( name , op ) ;
225227 }
226228
227229 private static String getLiteralType (RelDataType type ) {
0 commit comments