public void testClassDecl() { final NewExpression newExpression = Expressions.new_( Object.class, Collections.<Expression>emptyList(), Arrays.<MemberDeclaration>asList( new FieldDeclaration( Modifier.PUBLIC | Modifier.FINAL, new ParameterExpression(String.class, "foo"), Expressions.constant("bar")), new ClassDeclaration( Modifier.PUBLIC | Modifier.STATIC, "MyClass", null, Collections.<Type>emptyList(), Arrays.<MemberDeclaration>asList( new FieldDeclaration( 0, new ParameterExpression(int.class, "x"), Expressions.constant(0)))), new FieldDeclaration(0, new ParameterExpression(int.class, "i"), null))); assertEquals( "new Object(){\n" + " public final String foo = \"bar\";\n" + " public static class MyClass {\n" + " int x = 0;\n" + " }\n" + " int i;\n" + "}", Expressions.toString(newExpression)); }
public void testWriteConstant() { // primitives assertEquals( "new int[] {\n" + " 1,\n" + " 2,\n" + " -1}", Expressions.toString(Expressions.constant(new int[] {1, 2, -1}))); // objects and nulls assertEquals( "new String[] {\n" + " \"foo\",\n" + " null}", Expressions.toString(Expressions.constant(new String[] {"foo", null}))); // automatically call constructor if it matches fields assertEquals( "new net.hydromatic.linq4j.test.Linq4jTest.Employee[] {\n" + " new net.hydromatic.linq4j.test.Linq4jTest.Employee(\n" + " 100,\n" + " \"Fred\",\n" + " 10),\n" + " new net.hydromatic.linq4j.test.Linq4jTest.Employee(\n" + " 110,\n" + " \"Bill\",\n" + " 30),\n" + " new net.hydromatic.linq4j.test.Linq4jTest.Employee(\n" + " 120,\n" + " \"Eric\",\n" + " 10),\n" + " new net.hydromatic.linq4j.test.Linq4jTest.Employee(\n" + " 130,\n" + " \"Janet\",\n" + " 10)}", Expressions.toString(Expressions.constant(Linq4jTest.emps))); }
public Result implement(EnumerableRelImplementor implementor, Prefer pref) { logger.debug("implementing enumerable"); final DrillImplementor drillImplementor = new DrillImplementor(this.client == null); DrillRel input = (DrillRel) getChild(); drillImplementor.go(input); String plan = drillImplementor.getJsonString(); Hook.LOGICAL_PLAN.run(plan); // not quite sure where this list was supposed to be set earlier, leaving it null got me back // the full result set final List<String> fieldNameList = rowType.getFieldNames(); // final List<String> fieldNameList = null; BlockStatement expr = new BlockBuilder() .append( Expressions.call( OF_METHOD, Expressions.constant(plan), // Expressions.call( Arrays.class, "asList", // Expressions.newArrayInit( String.class, Functions.apply(fieldNameList, TO_LITERAL)) // ), Expressions.constant(Object.class), // Expressions.variable(DataContext.class, "root"))) .toBlock(); final PhysType physType = PhysTypeImpl.of( implementor.getTypeFactory(), getRowType(), pref.prefer(JavaRowFormat.ARRAY)); return new Result(expr, physType, JavaRowFormat.ARRAY); }
private Expression translate0(RexNode expr) { if (expr instanceof RexInputRef) { // TODO: multiple inputs, e.g. joins final Expression input = getInput(0); final int index = ((RexInputRef) expr).getIndex(); final List<RelDataTypeField> fields = program.getInputRowType().getFieldList(); final RelDataTypeField field = fields.get(index); if (fields.size() == 1) { return input; } else if (input.getType() == Object[].class) { return Expressions.convert_( Expressions.arrayIndex(input, Expressions.constant(field.getIndex())), Types.box(JavaRules.EnumUtil.javaClass(typeFactory, field.getType()))); } else { return Expressions.field(input, field.getName()); } } if (expr instanceof RexLocalRef) { return translate(program.getExprList().get(((RexLocalRef) expr).getIndex())); } if (expr instanceof RexLiteral) { return Expressions.constant( ((RexLiteral) expr).getValue(), typeFactory.getJavaClass(expr.getType())); } if (expr instanceof RexCall) { final RexCall call = (RexCall) expr; final SqlOperator operator = call.getOperator(); final ExpressionType expressionType = SQL_TO_LINQ_OPERATOR_MAP.get(operator); if (expressionType != null) { switch (operator.getSyntax()) { case Binary: return Expressions.makeBinary( expressionType, translate(call.getOperands()[0]), translate(call.getOperands()[1])); case Postfix: case Prefix: return Expressions.makeUnary(expressionType, translate(call.getOperands()[0])); default: throw new RuntimeException("unknown syntax " + operator.getSyntax()); } } Method method = SQL_OP_TO_JAVA_METHOD_MAP.get(operator); if (method != null) { List<Expression> exprs = translateList(Arrays.asList(call.operands)); return !Modifier.isStatic(method.getModifiers()) ? Expressions.call(exprs.get(0), method, exprs.subList(1, exprs.size())) : Expressions.call(method, exprs); } switch (expr.getKind()) { default: throw new RuntimeException("cannot translate expression " + expr); } } throw new RuntimeException("cannot translate expression " + expr); }
public void testWriteArray() { assertEquals( "1 + integers[2 + index]", Expressions.toString( Expressions.add( Expressions.constant(1), Expressions.arrayIndex( Expressions.variable(int[].class, "integers"), Expressions.add( Expressions.constant(2), Expressions.variable(int.class, "index")))))); }
public void testLambdaCallsBinaryOp() { // A parameter for the lambda expression. ParameterExpression paramExpr = Expressions.parameter(Integer.TYPE, "arg"); // This expression represents a lambda expression // that adds 1 to the parameter value. FunctionExpression lambdaExpr = Expressions.lambda( Expressions.add(paramExpr, Expressions.constant(2)), Arrays.asList(paramExpr)); // Print out the expression. String s = Expressions.toString(lambdaExpr); assertEquals( "new net.hydromatic.linq4j.function.Function1() {\n" + " public int apply(Integer arg) {\n" + " return arg + 2;\n" + " }\n" + " public Object apply(Object arg) {\n" + " return apply(\n" + " (Integer) arg);\n" + " }\n" + "}\n", s); // Compile and run the lambda expression. // The value of the parameter is 1. int n = (Integer) lambdaExpr.compile().dynamicInvoke(1); // This code example produces the following output: // // arg => (arg +2) // 3 assertEquals(3, n); }
public void testBlockBuilder2() { BlockBuilder statements = new BlockBuilder(); Expression element = statements.append("element", Expressions.constant(null)); Expression comparator = statements.append("comparator", Expressions.constant(null, Comparator.class)); Expression treeSet = statements.append("treeSet", Expressions.new_(TreeSet.class, Arrays.asList(comparator))); statements.add(Expressions.return_(null, Expressions.call(treeSet, "add", element))); assertEquals( "{\n" + " final java.util.Comparator comparator = null;\n" + " final java.util.TreeSet treeSet = new java.util.TreeSet(\n" + " comparator);\n" + " return treeSet.add(null);\n" + "}\n", Expressions.toString(statements.toBlock())); }
public void testBlockBuilder() { BlockBuilder statements = new BlockBuilder(); Expression one = statements.append("one", Expressions.constant(1)); Expression two = statements.append("two", Expressions.constant(2)); Expression three = statements.append("three", Expressions.add(one, two)); Expression six = statements.append("six", Expressions.multiply(three, two)); Expression eighteen = statements.append("eighteen", Expressions.multiply(three, six)); statements.add(Expressions.return_(null, eighteen)); assertEquals( "{\n" + " final int three = 1 + 2;\n" + " final int six = three * 2;\n" + " final int eighteen = three * six;\n" + " return eighteen;\n" + "}\n", Expressions.toString(statements.toBlock())); }
public void testWriteWhile() { DeclarationExpression xDecl, yDecl; Node node = Expressions.block( xDecl = Expressions.declare(0, "x", Expressions.constant(10)), yDecl = Expressions.declare(0, "y", Expressions.constant(0)), Expressions.while_( Expressions.lessThan(xDecl.parameter, Expressions.constant(5)), Expressions.statement(Expressions.preIncrementAssign(yDecl.parameter)))); assertEquals( "{\n" + " int x = 10;\n" + " int y = 0;\n" + " while (x < 5) {\n" + " ++y;\n" + " }\n" + "}\n", Expressions.toString(node)); }
/** Returns the expression to access a table within a schema. */ public static Expression tableExpression( Schema schema, Type elementType, String tableName, Class clazz) { final MethodCallExpression expression; if (Table.class.isAssignableFrom(clazz)) { expression = Expressions.call( schema.getExpression(), BuiltinMethod.SCHEMA_GET_TABLE.method, Expressions.constant(tableName)); } else { expression = Expressions.call( BuiltinMethod.SCHEMAS_QUERYABLE.method, DataContext.ROOT, schema.getExpression(), Expressions.constant(elementType), Expressions.constant(tableName)); } return Types.castIfNecessary(clazz, expression); }
/** Returns the expression for a sub-schema. */ public static Expression subSchemaExpression(Schema schema, String name, Class type) { // (Type) schemaExpression.getSubSchema("name") Expression call = Expressions.call( schema.getExpression(), BuiltinMethod.SCHEMA_GET_SUB_SCHEMA.method, Expressions.constant(name)); // CHECKSTYLE: IGNORE 2 //noinspection unchecked if (false && type != null && !type.isAssignableFrom(Schema.class)) { return unwrap(call, type); } return call; }
/** * Converts a schema expression to a given type by calling the {@link * net.hydromatic.optiq.SchemaPlus#unwrap(Class)} method. */ public static Expression unwrap(Expression call, Class type) { return Expressions.convert_( Expressions.call(call, BuiltinMethod.SCHEMA_PLUS_UNWRAP.method, Expressions.constant(type)), type); }
public void testWrite() { assertEquals( "1 + 2.0F + 3L + Long.valueOf(4L)", Expressions.toString( Expressions.add( Expressions.add( Expressions.add(Expressions.constant(1), Expressions.constant(2F, Float.TYPE)), Expressions.constant(3L, Long.TYPE)), Expressions.constant(4L, Long.class)))); assertEquals( "new java.math.BigDecimal(31415926L, 7)", Expressions.toString(Expressions.constant(BigDecimal.valueOf(314159260, 8)))); // Parentheses needed, to override the left-associativity of +. assertEquals( "1 + (2 + 3)", Expressions.toString( Expressions.add( Expressions.constant(1), Expressions.add(Expressions.constant(2), Expressions.constant(3))))); // No parentheses needed; higher precedence of * achieves the desired // effect. assertEquals( "1 + 2 * 3", Expressions.toString( Expressions.add( Expressions.constant(1), Expressions.multiply(Expressions.constant(2), Expressions.constant(3))))); assertEquals( "1 * (2 + 3)", Expressions.toString( Expressions.multiply( Expressions.constant(1), Expressions.add(Expressions.constant(2), Expressions.constant(3))))); // Parentheses needed, to overcome right-associativity of =. assertEquals( "(1 = 2) = 3", Expressions.toString( Expressions.assign( Expressions.assign(Expressions.constant(1), Expressions.constant(2)), Expressions.constant(3)))); // Ternary operator. assertEquals( "1 < 2 ? (3 < 4 ? 5 : 6) : 7 < 8 ? 9 : 10", Expressions.toString( Expressions.condition( Expressions.lessThan(Expressions.constant(1), Expressions.constant(2)), Expressions.condition( Expressions.lessThan(Expressions.constant(3), Expressions.constant(4)), Expressions.constant(5), Expressions.constant(6)), Expressions.condition( Expressions.lessThan(Expressions.constant(7), Expressions.constant(8)), Expressions.constant(9), Expressions.constant(10))))); assertEquals( "0 + (double) (2 + 3)", Expressions.toString( Expressions.add( Expressions.constant(0), Expressions.convert_( Expressions.add(Expressions.constant(2), Expressions.constant(3)), Double.TYPE)))); assertEquals( "a.empno", Expressions.toString( Expressions.field(Expressions.parameter(Linq4jTest.Employee.class, "a"), "empno"))); assertEquals( "java.util.Collections.EMPTY_LIST", Expressions.toString(Expressions.field(null, Collections.class, "EMPTY_LIST"))); final ParameterExpression paramX = Expressions.parameter(String.class, "x"); assertEquals( "new net.hydromatic.linq4j.function.Function1() {\n" + " public int apply(String x) {\n" + " return x.length();\n" + " }\n" + " public Object apply(Object x) {\n" + " return apply(\n" + " (String) x);\n" + " }\n" + "}\n", Expressions.toString( Expressions.lambda( Function1.class, Expressions.call(paramX, "length", Collections.<Expression>emptyList()), Arrays.asList(paramX)))); assertEquals( "new String[] {\n" + " \"foo\",\n" + " null,\n" + " \"bar\\\"baz\"}", Expressions.toString( Expressions.newArrayInit( String.class, Arrays.<Expression>asList( Expressions.constant("foo"), Expressions.constant(null), Expressions.constant("bar\"baz"))))); assertEquals( "(int) ((String) (Object) \"foo\").length()", Expressions.toString( Expressions.convert_( Expressions.call( Expressions.convert_( Expressions.convert_(Expressions.constant("foo"), Object.class), String.class), "length", Collections.<Expression>emptyList()), Integer.TYPE))); // resolving a static method assertEquals( "Integer.valueOf(\"0123\")", Expressions.toString( Expressions.call( Integer.class, "valueOf", Collections.<Expression>singletonList(Expressions.constant("0123"))))); // precedence of not and instanceof assertEquals( "!(o instanceof String)", Expressions.toString( Expressions.not( Expressions.typeIs(Expressions.parameter(Object.class, "o"), String.class)))); // not not assertEquals( "!!(o instanceof String)", Expressions.toString( Expressions.not( Expressions.not( Expressions.typeIs(Expressions.parameter(Object.class, "o"), String.class))))); }
public void testReturn() { assertEquals( "if (true) {\n" + " return;\n" + "}\n", Expressions.toString( Expressions.ifThen(Expressions.constant(true), Expressions.return_(null)))); }
public void testWriteAnonymousClass() { // final List<String> baz = Arrays.asList("foo", "bar"); // new AbstractList<String>() { // public int size() { // return baz.size(); // } // public String get(int index) { // return ((String) baz.get(index)).toUpperCase(); // } // } final ParameterExpression bazParameter = Expressions.parameter(Types.of(List.class, String.class), "baz"); final ParameterExpression indexParameter = Expressions.parameter(Integer.TYPE, "index"); BlockExpression e = Expressions.block( Expressions.declare( Modifier.FINAL, bazParameter, Expressions.call( Arrays.class, "asList", Arrays.<Expression>asList( Expressions.constant("foo"), Expressions.constant("bar")))), Expressions.statement( Expressions.new_( Types.of(AbstractList.class, String.class), Collections.<Expression>emptyList(), Arrays.<MemberDeclaration>asList( Expressions.fieldDecl( Modifier.PUBLIC | Modifier.FINAL, Expressions.parameter(String.class, "qux"), Expressions.constant("xyzzy")), Expressions.methodDecl( Modifier.PUBLIC, Integer.TYPE, "size", Collections.<ParameterExpression>emptyList(), Blocks.toFunctionBlock( Expressions.call( bazParameter, "size", Collections.<Expression>emptyList()))), Expressions.methodDecl( Modifier.PUBLIC, String.class, "get", Arrays.asList(indexParameter), Blocks.toFunctionBlock( Expressions.call( Expressions.convert_( Expressions.call( bazParameter, "get", Arrays.<Expression>asList(indexParameter)), String.class), "toUpperCase", Collections.<Expression>emptyList()))))))); assertEquals( "{\n" + " final java.util.List<String> baz = java.util.Arrays.asList(\"foo\", \"bar\");\n" + " new java.util.AbstractList<String>(){\n" + " public final String qux = \"xyzzy\";\n" + " public int size() {\n" + " return baz.size();\n" + " }\n" + "\n" + " public String get(int index) {\n" + " return ((String) baz.get(index)).toUpperCase();\n" + " }\n" + "\n" + " };\n" + "}\n", Expressions.toString(e)); }
@Override public Expression apply(String a0) { return Expressions.constant(a0); }