/** Returns the path of a schema, appending the name of a table if not null. */ public static List<String> path(Schema schema, String name) { final List<String> list = new ArrayList<String>(); if (name != null) { list.add(name); } for (Schema s = schema; s != null; s = s.getParentSchema()) { if (s.getParentSchema() != null || !s.getName().equals("")) { // Omit the root schema's name from the path if it's the empty string, // which it usually is. list.add(s.getName()); } } return ImmutableList.copyOf(Lists.reverse(list)); }
public static TableFunction methodMember(final Method method, final JavaTypeFactory typeFactory) { final List<Parameter> parameters = new ArrayList<Parameter>(); for (final Class<?> parameterType : method.getParameterTypes()) { parameters.add( new Parameter() { final int ordinal = parameters.size(); final RelDataType type = typeFactory.createType(parameterType); public int getOrdinal() { return ordinal; } public String getName() { return "a" + ordinal; } public RelDataType getType(RelDataTypeFactory typeFactory) { return type; } }); } return new TableFunction() { public List<Parameter> getParameters() { return parameters; } public Table apply(List<Object> arguments) { try { //noinspection unchecked return (Table) method.invoke(null, arguments.toArray()); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } public RelDataType getRowType(RelDataTypeFactory typeFactory) { final Class<?> returnType = method.getReturnType(); return ((JavaTypeFactory) typeFactory).createType(returnType); } }; }
public static OptiqSchema.TableFunctionEntry resolve( RelDataTypeFactory typeFactory, String name, Collection<OptiqSchema.TableFunctionEntry> tableFunctions, List<RelDataType> argumentTypes) { final List<OptiqSchema.TableFunctionEntry> matches = new ArrayList<OptiqSchema.TableFunctionEntry>(); for (OptiqSchema.TableFunctionEntry member : tableFunctions) { if (matches(typeFactory, member.getTableFunction(), argumentTypes)) { matches.add(member); } } switch (matches.size()) { case 0: return null; case 1: return matches.get(0); default: throw new RuntimeException( "More than one match for " + name + " with arguments " + argumentTypes); } }