/** * Registers method if it: a. is public, and b. is named "convertXxx", and c. has a return type of * "RexNode" or a subtype d. has a 2 parameters with types ConvertletContext and SqlNode (or a * subtype) respectively. */ private void registerNodeTypeMethod(final Method method) { if (!Modifier.isPublic(method.getModifiers())) { return; } if (!method.getName().startsWith("convert")) { return; } if (!RexNode.class.isAssignableFrom(method.getReturnType())) { return; } final Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length != 2) { return; } if (parameterTypes[0] != SqlRexContext.class) { return; } final Class parameterType = parameterTypes[1]; if (!SqlNode.class.isAssignableFrom(parameterType)) { return; } map.put( parameterType, new SqlRexConvertlet() { public RexNode convertCall(SqlRexContext cx, SqlCall call) { try { return (RexNode) method.invoke(ReflectiveConvertletTable.this, cx, call); } catch (IllegalAccessException e) { throw Util.newInternal(e, "while converting " + call); } catch (InvocationTargetException e) { throw Util.newInternal(e, "while converting " + call); } } }); }
/** * Registers that one operator is an alias for another. * * @param alias Operator which is alias * @param target Operator to translate calls to */ protected void addAlias(final SqlOperator alias, final SqlOperator target) { map.put( alias, new SqlRexConvertlet() { public RexNode convertCall(SqlRexContext cx, SqlCall call) { Util.permAssert(call.getOperator() == alias, "call to wrong operator"); final SqlCall newCall = target.createCall(SqlParserPos.ZERO, call.getOperandList()); return cx.convertExpression(newCall); } }); }
protected void registerSchema(MockSchema schema) { schemas.put(schema.name, schema); }
/** * Registers a convertlet for a given operator instance * * @param op Operator instance, say {@link org.eigenbase.sql.fun.SqlStdOperatorTable#MINUS} * @param convertlet Convertlet */ protected void registerOp(SqlOperator op, SqlRexConvertlet convertlet) { map.put(op, convertlet); }