private static String checkNotNullOrEmpty(String value, String name) { requireNonNull(value, name + " is null"); checkArgument(!value.isEmpty(), name + " is empty"); return value; }
private Procedure procedure(String schema, String name, String methodName, List<Argument> arguments) { return new Procedure(schema, name, arguments, handle(methodName)); }
private void validateProcedure(Procedure procedure) { List<Class<?>> parameters = procedure.getMethodHandle().type().parameterList().stream() .filter(type -> !ConnectorSession.class.isAssignableFrom(type)) .collect(toList()); for (int i = 0; i < procedure.getArguments().size(); i++) { Argument argument = procedure.getArguments().get(i); Type type = typeManager.getType(argument.getType()); Class<?> argumentType = Primitives.unwrap(parameters.get(i)); Class<?> expectedType = getObjectType(type); checkArgument(expectedType.equals(argumentType), "Argument '%s' has invalid type %s (expected %s)", argument.getName(), argumentType.getName(), expectedType.getName()); } }
public List<Procedure> getProcedures(String schema) { return ImmutableList.<Procedure>builder() .add(procedure(schema, "test_simple", "simple", ImmutableList.of())) .add(procedure(schema, "test_args", "args", ImmutableList.of( new Argument("x", BIGINT), new Argument("y", DOUBLE), new Argument("z", VARCHAR), new Argument("q", BOOLEAN)))) .add(procedure(schema, "test_nulls", "nulls", ImmutableList.of( new Argument("x", BIGINT), new Argument("y", VARCHAR)))) .add(procedure(schema, "test_arrays", "arrays", ImmutableList.of( new Argument("x", "array(bigint)"), new Argument("y", "array(varchar)")))) .add(procedure(schema, "test_nested", "nested", ImmutableList.of( new Argument("x", "array(array(bigint))")))) .add(procedure(schema, "test_session_first", "sessionFirst", ImmutableList.of( new Argument("x", BIGINT)))) .add(procedure(schema, "test_session_last", "sessionLast", ImmutableList.of( new Argument("x", VARCHAR)))) .add(procedure(schema, "test_exception", "exception", ImmutableList.of())) .add(procedure(schema, "test_error", "error", ImmutableList.of())) .build(); }
public Procedure(String schema, String name, List<Argument> arguments, MethodHandle methodHandle) { this.schema = checkNotNullOrEmpty(schema, "schema").toLowerCase(ENGLISH); this.name = checkNotNullOrEmpty(name, "name").toLowerCase(ENGLISH); this.arguments = unmodifiableList(new ArrayList<>(arguments)); this.methodHandle = requireNonNull(methodHandle, "methodHandle is null"); Set<String> names = new HashSet<>(); for (Argument argument : arguments) { checkArgument(names.add(argument.getName()), "Duplicate argument name: " + argument.getName()); } checkArgument(!methodHandle.isVarargsCollector(), "Method must have fixed arity"); checkArgument(methodHandle.type().returnType() == void.class, "Method must return void"); long parameterCount = methodHandle.type().parameterList().stream() .filter(type -> !ConnectorSession.class.isAssignableFrom(type)) .count(); checkArgument(parameterCount == arguments.size(), "Method parameter count must match arguments"); }
public void addProcedures(ConnectorId connectorId, Collection<Procedure> procedures) { requireNonNull(connectorId, "connectorId is null"); requireNonNull(procedures, "procedures is null"); procedures.forEach(this::validateProcedure); Map<SchemaTableName, Procedure> proceduresByName = Maps.uniqueIndex( procedures, procedure -> new SchemaTableName(procedure.getSchema(), procedure.getName())); checkState(connectorProcedures.putIfAbsent(connectorId, proceduresByName) == null, "Procedures already registered for connector: %s", connectorId); }
@Override public Procedure get() { return new Procedure( "system", "create_empty_partition", ImmutableList.of( new Argument("schema_name", VARCHAR), new Argument("table_name", VARCHAR), new Argument("partition_columns", "array(varchar)"), new Argument("partition_values", "array(varchar)")), CREATE_EMPTY_PARTITION.bindTo(this)); }
private void validateProcedure(Procedure procedure) { List<Class<?>> parameters = procedure.getMethodHandle().type().parameterList().stream() .filter(type -> !ConnectorSession.class.isAssignableFrom(type)) .collect(toList()); for (int i = 0; i < procedure.getArguments().size(); i++) { Argument argument = procedure.getArguments().get(i); Type type = typeManager.getType(argument.getType()); Class<?> argumentType = Primitives.unwrap(parameters.get(i)); Class<?> expectedType = getObjectType(type); checkArgument(expectedType.equals(argumentType), "Argument '%s' has invalid type %s (expected %s)", argument.getName(), argumentType.getName(), expectedType.getName()); } }
@Override public Procedure get() { return new Procedure( "system", "write_hive_metastore_recording", ImmutableList.of(), WRITE_HIVE_METASTORE_RECORDING.bindTo(this)); }
public void addProcedures(ConnectorId connectorId, Collection<Procedure> procedures) { requireNonNull(connectorId, "connectorId is null"); requireNonNull(procedures, "procedures is null"); procedures.forEach(this::validateProcedure); Map<SchemaTableName, Procedure> proceduresByName = Maps.uniqueIndex( procedures, procedure -> new SchemaTableName(procedure.getSchema(), procedure.getName())); checkState(connectorProcedures.putIfAbsent(connectorId, proceduresByName) == null, "Procedures already registered for connector: %s", connectorId); }
for (int i = 0; i < procedure.getArguments().size(); i++) { positions.put(procedure.getArguments().get(i).getName(), i); else if (i < procedure.getArguments().size()) { names.put(procedure.getArguments().get(i).getName(), argument); Object[] values = new Object[procedure.getArguments().size()]; for (Entry<String, CallArgument> entry : names.entrySet()) { CallArgument callArgument = entry.getValue(); int index = positions.get(entry.getKey()); Argument argument = procedure.getArguments().get(index); Type type = metadata.getType(argument.getType()); checkCondition(type != null, INVALID_PROCEDURE_DEFINITION, "Unknown procedure argument type: %s", argument.getType()); MethodType methodType = procedure.getMethodHandle().type(); for (int i = 0; i < procedure.getArguments().size(); i++) { if ((values[i] == null) && methodType.parameterType(i).isPrimitive()) { String name = procedure.getArguments().get(i).getName(); throw new PrestoException(INVALID_PROCEDURE_ARGUMENT, "Procedure argument cannot be null: " + name); procedure.getMethodHandle().invokeWithArguments(arguments);
for (int i = 0; i < procedure.getArguments().size(); i++) { positions.put(procedure.getArguments().get(i).getName(), i); else if (i < procedure.getArguments().size()) { names.put(procedure.getArguments().get(i).getName(), argument); Object[] values = new Object[procedure.getArguments().size()]; for (Entry<String, CallArgument> entry : names.entrySet()) { CallArgument callArgument = entry.getValue(); int index = positions.get(entry.getKey()); Argument argument = procedure.getArguments().get(index); Type type = metadata.getType(argument.getType()); checkCondition(type != null, INVALID_PROCEDURE_DEFINITION, "Unknown procedure argument type: %s", argument.getType()); MethodType methodType = procedure.getMethodHandle().type(); for (int i = 0; i < procedure.getArguments().size(); i++) { if ((values[i] == null) && methodType.parameterType(i).isPrimitive()) { String name = procedure.getArguments().get(i).getName(); throw new PrestoException(INVALID_PROCEDURE_ARGUMENT, "Procedure argument cannot be null: " + name); procedure.getMethodHandle().invokeWithArguments(arguments);