@Description( "List all user functions in the DBMS." ) @Procedure( name = "dbms.functions", mode = DBMS ) public Stream<FunctionResult> listFunctions() { securityContext.assertCredentialsNotExpired(); return graph.getDependencyResolver().resolveDependency( Procedures.class ).getAllFunctions().stream() .sorted( Comparator.comparing( a -> a.name().toString() ) ) .map( FunctionResult::new ); }
public UserFunctionSignature build() { if ( outputType == null ) { throw new IllegalStateException( "output type must be set" ); } return new UserFunctionSignature( name, inputSignature, outputType, deprecated, allowed, description, false ); } }
private FunctionResult( UserFunctionSignature signature ) { this.name = signature.name().toString(); this.signature = signature.toString(); this.description = signature.description().orElse( "" ); } }
public static QualifiedName procedureName( String... namespaceAndName ) { return functionSignature( namespaceAndName ).build().name(); } }
SubFunction( TemporalFunction<T> base, String name, List<FieldSignature> input, String description ) { this.function = base; this.signature = new UserFunctionSignature( new QualifiedName( new String[] {base.signature.name().name()}, name ), input, base.signature.outputType(), null, ALLOWED, description, true ); }
@Override public UserAggregator create( Context ctx ) throws ProcedureException { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, signature().description().orElse( "Failed to load " + signature().name() ) ); } }
Object rs = udfMethod.invoke( cls, mapToObjects( "Function", signature.name(), signature.inputSignature(), input ) ); "Failed to invoke function `%s`: %s", signature.name(), "Caused by: " + (cause != null ? cause : throwable) );
private FunctionResult( UserFunctionSignature signature ) { this.name = signature.name().toString(); this.signature = signature.toString(); this.description = signature.description().orElse( "" ); roles = Stream.of( "admin", "reader", "editor", "publisher", "architect" ).collect( toList() ); roles.addAll( Arrays.asList( signature.allowed() ) ); } }
/** * Register a new function. * * @param function the function. */ public void register( CallableUserFunction function, boolean overrideCurrentImplementation ) throws ProcedureException { UserFunctionSignature signature = function.signature(); QualifiedName name = signature.name(); CallableUserFunction oldImplementation = functions.get( name ); if ( oldImplementation == null ) { functions.put( name, function, signature.caseInsensitive() ); } else { if ( overrideCurrentImplementation ) { functions.put( name, function, signature.caseInsensitive() ); } else { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, "Unable to register function, because the name `%s` is already in use.", name ); } } }
for ( CallableUserFunction func : funcs ) String name = func.signature().name().name(); func.apply( new BasicContext(), new AnyValue[0] ); switch ( name ) assertFalse( "Should not be deprecated", func.signature().deprecated().isPresent() ); break; case "oldFunc": case "badFunc": assertTrue( "Should be deprecated", func.signature().deprecated().isPresent() ); assertThat( func.signature().deprecated().get(), equalTo( "newFunc" ) ); break; default:
@Test public void toStringShouldMatchCypherSyntax() { // When String toStr = functionSignature( "org", "myProcedure" ) .in( "in", Neo4jTypes.NTList( Neo4jTypes.NTString ) ) .out( Neo4jTypes.NTNumber ) .build() .toString(); // Then assertEquals( "org.myProcedure(in :: LIST? OF STRING?) :: (NUMBER?)", toStr ); } }
public static Builder functionSignature( String... namespaceAndName ) { String[] namespace = namespaceAndName.length > 1 ? Arrays.copyOf( namespaceAndName, namespaceAndName.length - 1 ) : new String[0]; String name = namespaceAndName[namespaceAndName.length - 1]; return functionSignature( namespace, name ); }
ReflectiveUserFunction( UserFunctionSignature signature, MethodHandle constructor, Method udfMethod, TypeMappers.TypeChecker typeChecker, ValueMapper<Object> mapper, List<FieldInjections.FieldSetter> fieldSetters ) { super( mapper, fieldSetters ); this.constructor = constructor; this.udfMethod = udfMethod; this.signature = signature; this.typeChecker = typeChecker; indexesToMap = computeIndexesToMap( signature.inputSignature() ); }
@Override public AnyValue apply( Context ctx, AnyValue[] input ) throws ProcedureException { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, signature().description().orElse( "Failed to load " + signature().name() ) ); } }
List<FieldSignature> inputSignature = signature.inputSignature(); int expectedNumberOfInputs = inputSignature.size(); "Failed to invoke function `%s`: %s", signature.name(), "Caused by: " + (cause != null ? cause : throwable ) );
SubFunction( TemporalFunction<T> base, String name, List<FieldSignature> input, String description ) { this.function = base; this.signature = new UserFunctionSignature( new QualifiedName( new String[] {base.signature.name().name()}, name ), input, base.signature.outputType(), null, ALLOWED, description, true ); }
/** * Register a new function. * * @param function the function. */ public void register( CallableUserAggregationFunction function, boolean overrideCurrentImplementation ) throws ProcedureException { UserFunctionSignature signature = function.signature(); QualifiedName name = signature.name(); CallableUserFunction oldImplementation = functions.get( name ); if ( oldImplementation == null ) { aggregationFunctions.put( name, function, signature.caseInsensitive() ); } else { if ( overrideCurrentImplementation ) { aggregationFunctions.put( name, function, signature.caseInsensitive() ); } else { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, "Unable to register aggregation function, because the name `%s` is already in use.", name ); } } }
public static QualifiedName procedureName( String... namespaceAndName ) { return functionSignature( namespaceAndName ).build().name(); } }
for ( CallableUserAggregationFunction func : funcs ) String name = func.signature().name().name(); func.create( new BasicContext()); switch ( name ) assertFalse( "Should not be deprecated", func.signature().deprecated().isPresent() ); break; case "oldFunc": case "badFunc": assertTrue( "Should be deprecated", func.signature().deprecated().isPresent() ); assertThat( func.signature().deprecated().get(), equalTo( "newFunc" ) ); break; default:
@Test public void shouldCompileFunction() throws Throwable { // When List<CallableUserFunction> function = compile( SingleReadOnlyFunction.class ); // Then assertEquals( 1, function.size() ); assertThat( function.get( 0 ).signature(), Matchers.equalTo( functionSignature( "org", "neo4j", "kernel", "impl", "proc", "listCoolPeople" ) .out( Neo4jTypes.NTList( Neo4jTypes.NTAny ) ) .build() ) ); }