Skip to content

Commit

Permalink
Remove unused call functions
Browse files Browse the repository at this point in the history
The SPI still exposed methods for calling write and schema functions which are now removed.
  • Loading branch information
pontusmelke committed Sep 9, 2016
1 parent b5825ce commit 5611917
Show file tree
Hide file tree
Showing 14 changed files with 20 additions and 109 deletions.
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.cypher.internal.compiler.v3_1.commands.expressions package org.neo4j.cypher.internal.compiler.v3_1.commands.expressions


import org.neo4j.cypher.internal.compiler.v3_1._ import org.neo4j.cypher.internal.compiler.v3_1._
import org.neo4j.cypher.internal.compiler.v3_1.executionplan.ProcedureCallMode
import org.neo4j.cypher.internal.compiler.v3_1.helpers.{RuntimeJavaValueConverter, RuntimeScalaValueConverter} import org.neo4j.cypher.internal.compiler.v3_1.helpers.{RuntimeJavaValueConverter, RuntimeScalaValueConverter}
import org.neo4j.cypher.internal.compiler.v3_1.mutation.GraphElementPropertyFunctions import org.neo4j.cypher.internal.compiler.v3_1.mutation.GraphElementPropertyFunctions
import org.neo4j.cypher.internal.compiler.v3_1.pipes.QueryState import org.neo4j.cypher.internal.compiler.v3_1.pipes.QueryState
Expand All @@ -30,16 +29,15 @@ import org.neo4j.cypher.internal.compiler.v3_1.symbols.SymbolTable
case class FunctionInvocation(signature: UserFunctionSignature, arguments: IndexedSeq[Expression]) case class FunctionInvocation(signature: UserFunctionSignature, arguments: IndexedSeq[Expression])
extends Expression with GraphElementPropertyFunctions { extends Expression with GraphElementPropertyFunctions {


private val callMode = ProcedureCallMode.fromAccessMode(signature.accessMode)

override def apply(ctx: ExecutionContext)(implicit state: QueryState): Any = { override def apply(ctx: ExecutionContext)(implicit state: QueryState): Any = {
val query = state.query val query = state.query


val isGraphKernelResultValue = query.isGraphKernelResultValue _ val isGraphKernelResultValue = query.isGraphKernelResultValue _
val converter = new RuntimeJavaValueConverter(state.query.isGraphKernelResultValue, state.typeConverter.asPublicType) val converter = new RuntimeJavaValueConverter(state.query.isGraphKernelResultValue, state.typeConverter.asPublicType)
val scalaValues = new RuntimeScalaValueConverter(isGraphKernelResultValue, state.typeConverter.asPrivateType) val scalaValues = new RuntimeScalaValueConverter(isGraphKernelResultValue, state.typeConverter.asPrivateType)
val argValues = arguments.map(arg => converter.asDeepJavaValue(arg(ctx)(state))) val argValues = arguments.map(arg => converter.asDeepJavaValue(arg(ctx)(state)))
val result = callMode.callFunction(query, signature.name, argValues)
val result = query.callFunction(signature.name, argValues, signature.allowed)


scalaValues.asDeepScalaValue(result) scalaValues.asDeepScalaValue(result)
} }
Expand Down
Expand Up @@ -36,8 +36,6 @@ sealed trait ProcedureCallMode {


def callProcedure(ctx: QueryContext, name: QualifiedName, args: Seq[Any]): Iterator[Array[AnyRef]] def callProcedure(ctx: QueryContext, name: QualifiedName, args: Seq[Any]): Iterator[Array[AnyRef]]


def callFunction(ctx: QueryContext, name: QualifiedName, args: Seq[Any]): AnyRef

val allowed: Array[String] val allowed: Array[String]
} }


Expand All @@ -46,9 +44,6 @@ case class LazyReadOnlyCallMode(allowed: Array[String]) extends ProcedureCallMod


override def callProcedure(ctx: QueryContext, name: QualifiedName, args: Seq[Any]): Iterator[Array[AnyRef]] = override def callProcedure(ctx: QueryContext, name: QualifiedName, args: Seq[Any]): Iterator[Array[AnyRef]] =
ctx.callReadOnlyProcedure(name, args, allowed) ctx.callReadOnlyProcedure(name, args, allowed)

override def callFunction(ctx: QueryContext, name: QualifiedName, args: Seq[Any]) =
ctx.callReadOnlyFunction(name, args, allowed)
} }


case class EagerReadWriteCallMode(allowed: Array[String]) extends ProcedureCallMode { case class EagerReadWriteCallMode(allowed: Array[String]) extends ProcedureCallMode {
Expand All @@ -62,9 +57,6 @@ case class EagerReadWriteCallMode(allowed: Array[String]) extends ProcedureCallM
} }
builder.result().iterator builder.result().iterator
} }

override def callFunction(ctx: QueryContext, name: QualifiedName, args: Seq[Any]) =
ctx.callReadWriteFunction(name, args, allowed)
} }


case class SchemaWriteCallMode(allowed: Array[String]) extends ProcedureCallMode { case class SchemaWriteCallMode(allowed: Array[String]) extends ProcedureCallMode {
Expand All @@ -78,9 +70,6 @@ case class SchemaWriteCallMode(allowed: Array[String]) extends ProcedureCallMode
} }
builder.result().iterator builder.result().iterator
} }

override def callFunction(ctx: QueryContext, name: QualifiedName, args: Seq[Any]) =
ctx.callSchemaWriteFunction(name, args, allowed)
} }


case class DbmsCallMode(allowed: Array[String]) extends ProcedureCallMode { case class DbmsCallMode(allowed: Array[String]) extends ProcedureCallMode {
Expand All @@ -94,7 +83,4 @@ case class DbmsCallMode(allowed: Array[String]) extends ProcedureCallMode {
} }
builder.result().iterator builder.result().iterator
} }

override def callFunction(ctx: QueryContext, name: QualifiedName, args: Seq[Any]) =
ctx.callDbmsFunction(name, args, allowed)
} }
Expand Up @@ -193,17 +193,8 @@ class DelegatingQueryContext(val inner: QueryContext) extends QueryContext {
override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
inner.callDbmsProcedure(name, args, allowed) inner.callDbmsProcedure(name, args, allowed)


override def callReadOnlyFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = override def callFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
singleDbHit(inner.callReadOnlyFunction(name, args, allowed)) singleDbHit(inner.callFunction(name, args, allowed))

override def callReadWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
singleDbHit(inner.callReadWriteFunction(name, args, allowed))

override def callSchemaWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
singleDbHit(inner.callSchemaWriteFunction(name, args, allowed))

override def callDbmsFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
inner.callDbmsFunction(name, args, allowed)


override def isGraphKernelResultValue(v: Any): Boolean = override def isGraphKernelResultValue(v: Any): Boolean =
inner.isGraphKernelResultValue(v) inner.isGraphKernelResultValue(v)
Expand Down
Expand Up @@ -37,7 +37,7 @@ case class UserFunctionSignature(name: QualifiedName,
inputSignature: IndexedSeq[FieldSignature], inputSignature: IndexedSeq[FieldSignature],
outputType: CypherType, outputType: CypherType,
deprecationInfo: Option[String], deprecationInfo: Option[String],
accessMode: ProcedureReadOnlyAccess) allowed: Array[String])


object QualifiedName { object QualifiedName {
def apply(unresolved: UnresolvedCall): QualifiedName = def apply(unresolved: UnresolvedCall): QualifiedName =
Expand Down
Expand Up @@ -164,12 +164,7 @@ trait QueryContext extends TokenContext {


def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]] def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]]


def callReadOnlyFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef def callFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef

def callReadWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef
def callSchemaWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef

def callDbmsFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef


// Check if a runtime value is a node, relationship, path or some such value returned from // Check if a runtime value is a node, relationship, path or some such value returned from
// other query context values by calling down to the underlying database // other query context values by calling down to the underlying database
Expand Down
Expand Up @@ -130,14 +130,7 @@ trait QueryContextAdaptation {


override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]] = ??? override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]] = ???


override def callReadOnlyFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef = ??? override def callFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef = ???

override def callDbmsFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef = ???

override def callSchemaWriteFunction(name: QualifiedName, args: Seq[Any],
allowed: Array[String]): AnyRef = ???

override def callReadWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]): AnyRef = ???


override def getOrCreateFromSchemaState[K, V](key: K, creator: => V): V = ??? override def getOrCreateFromSchemaState[K, V](key: K, creator: => V): V = ???


Expand Down
Expand Up @@ -141,17 +141,8 @@ class ExceptionTranslatingQueryContextFor3_1(val inner: QueryContext) extends Qu
override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]] = override def callDbmsProcedure(name: QualifiedName, args: Seq[Any], allowed: Array[String]): Iterator[Array[AnyRef]] =
translateIterator(inner.callDbmsProcedure(name, args, allowed)) translateIterator(inner.callDbmsProcedure(name, args, allowed))


override def callReadOnlyFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = override def callFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
translateException(inner.callReadOnlyFunction(name, args, allowed)) translateException(inner.callFunction(name, args, allowed))

override def callReadWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
translateException(inner.callReadWriteFunction(name, args, allowed))

override def callSchemaWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
translateException(inner.callSchemaWriteFunction(name, args, allowed))

override def callDbmsFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) =
translateException(inner.callDbmsFunction(name, args, allowed))


override def isGraphKernelResultValue(v: Any): Boolean = override def isGraphKernelResultValue(v: Any): Boolean =
translateException(inner.isGraphKernelResultValue(v)) translateException(inner.isGraphKernelResultValue(v))
Expand Down
Expand Up @@ -151,7 +151,7 @@ class TransactionBoundPlanContext(tc: TransactionalContextWrapperv3_1)
val output = asCypherType(ks.outputType()) val output = asCypherType(ks.outputType())
val deprecationInfo = asOption(ks.deprecated()) val deprecationInfo = asOption(ks.deprecated())


Some(UserFunctionSignature(name, input, output, deprecationInfo, ProcedureReadOnlyAccess(ks.allowed()))) Some(UserFunctionSignature(name, input, output, deprecationInfo, ks.allowed()))
} }
else None else None
} }
Expand Down
Expand Up @@ -636,36 +636,13 @@ final class TransactionBoundQueryContext(val transactionalContext: Transactional
} }
} }


override def callReadOnlyFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = { override def callFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = {
val revertable = transactionalContext.accessMode match { val revertable = transactionalContext.accessMode match {
case a: AuthSubject if a.allowsProcedureWith(allowed) => case a: AuthSubject if a.allowsProcedureWith(allowed) =>
Some(transactionalContext.restrictCurrentTransaction(AccessMode.Static.OVERRIDE_READ)) Some(transactionalContext.restrictCurrentTransaction(AccessMode.Static.OVERRIDE_READ))
case _ => None case _ => None
} }
callFunction(name, args, transactionalContext.statement.readOperations().functionCallRead, revertable.foreach(_.close)) callFunction(name, args, transactionalContext.statement.readOperations().functionCall, revertable.foreach(_.close))
}

override def callReadWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = {
val revertable = transactionalContext.accessMode match {
case a: AuthSubject if a.allowsProcedureWith(allowed) =>
Some(transactionalContext.restrictCurrentTransaction(AccessMode.Static.OVERRIDE_WRITE))
case _ => None
}
callFunction(name, args, transactionalContext.statement.dataWriteOperations().functionCallWrite,
revertable.foreach(_.close))
}

override def callSchemaWriteFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = {
val revertable = transactionalContext.accessMode match {
case a: AuthSubject if a.allowsProcedureWith(allowed) =>
Some(transactionalContext.restrictCurrentTransaction(AccessMode.Static.OVERRIDE_SCHEMA))
case _ => None
}
callFunction(name, args, transactionalContext.statement.schemaWriteOperations().functionCallSchema, revertable.foreach(_.close))
}

override def callDbmsFunction(name: QualifiedName, args: Seq[Any], allowed: Array[String]) = {
callFunction(name, args, transactionalContext.dbmsOperations.functionCallDbms, ())
} }


private def callFunction(name: QualifiedName, args: Seq[Any], private def callFunction(name: QualifiedName, args: Seq[Any],
Expand Down
Expand Up @@ -151,6 +151,4 @@ void relationshipRemoveFromLegacyIndex( String indexName, long relationship )


/** Invoke a read/write procedure by name */ /** Invoke a read/write procedure by name */
RawIterator<Object[], ProcedureException> procedureCallWrite( QualifiedName name, Object[] input ) throws ProcedureException; RawIterator<Object[], ProcedureException> procedureCallWrite( QualifiedName name, Object[] input ) throws ProcedureException;

Object functionCallWrite( QualifiedName name, Object[] input ) throws ProcedureException;
} }
Expand Up @@ -567,5 +567,5 @@ DoubleLongRegister indexSample( IndexDescriptor index, DoubleLongRegister target
RawIterator<Object[], ProcedureException> procedureCallRead( QualifiedName name, Object[] input ) throws ProcedureException; RawIterator<Object[], ProcedureException> procedureCallRead( QualifiedName name, Object[] input ) throws ProcedureException;


/** Invoke a read-only procedure by name */ /** Invoke a read-only procedure by name */
Object functionCallRead( QualifiedName name, Object[] input ) throws ProcedureException; Object functionCall( QualifiedName name, Object[] input ) throws ProcedureException;
} }
Expand Up @@ -67,6 +67,4 @@ RelationshipPropertyExistenceConstraint relationshipPropertyExistenceConstraintC


/** Invoke a schema procedure by name */ /** Invoke a schema procedure by name */
RawIterator<Object[], ProcedureException> procedureCallSchema( QualifiedName name, Object[] input ) throws ProcedureException; RawIterator<Object[], ProcedureException> procedureCallSchema( QualifiedName name, Object[] input ) throws ProcedureException;

Object functionCallSchema( QualifiedName name, Object[] input ) throws ProcedureException;
} }
Expand Up @@ -558,9 +558,9 @@ public Optional<UserFunctionSignature> functionGet( QualifiedName name )
} }


@Override @Override
public Object functionCallRead( QualifiedName name, Object[] input ) throws ProcedureException public Object functionCall( QualifiedName name, Object[] input ) throws ProcedureException
{ {
return callFunction( name, input, AccessMode.Static.READ ); return callFunction( name, input );
} }


@Override @Override
Expand Down Expand Up @@ -1089,12 +1089,6 @@ public RawIterator<Object[], ProcedureException> procedureCallWrite( QualifiedNa
return callProcedure( name, input, AccessMode.Static.FULL ); return callProcedure( name, input, AccessMode.Static.FULL );
} }


@Override
public Object functionCallWrite( QualifiedName name, Object[] input ) throws ProcedureException
{
// FIXME: should this be AccessMode.Static.WRITE instead?
return callFunction( name, input, AccessMode.Static.FULL );
}
// </DataWrite> // </DataWrite>


// <SchemaWrite> // <SchemaWrite>
Expand Down Expand Up @@ -1165,12 +1159,6 @@ public RawIterator<Object[], ProcedureException> procedureCallSchema( QualifiedN
return callProcedure( name, input, AccessMode.Static.FULL ); return callProcedure( name, input, AccessMode.Static.FULL );
} }


@Override
public Object functionCallSchema( QualifiedName name, Object[] input ) throws ProcedureException
{
return callFunction( name, input, AccessMode.Static.FULL );
}

// </SchemaWrite> // </SchemaWrite>


// <Locking> // <Locking>
Expand Down Expand Up @@ -1511,7 +1499,7 @@ private RawIterator<Object[],ProcedureException> callProcedure(
{ {
statement.assertOpen(); statement.assertOpen();


try ( KernelTransaction.Revertable revertable = tx.overrideWith( mode ) ) try ( KernelTransaction.Revertable ignore = tx.overrideWith( mode ) )
{ {
BasicContext ctx = new BasicContext(); BasicContext ctx = new BasicContext();
ctx.put( Context.KERNEL_TRANSACTION, tx ); ctx.put( Context.KERNEL_TRANSACTION, tx );
Expand All @@ -1521,12 +1509,12 @@ private RawIterator<Object[],ProcedureException> callProcedure(
} }


private Object callFunction( private Object callFunction(
QualifiedName name, Object[] input, AccessMode mode ) QualifiedName name, Object[] input )
throws ProcedureException throws ProcedureException
{ {
statement.assertOpen(); statement.assertOpen();


try ( KernelTransaction.Revertable revertable = tx.overrideWith( mode ) ) try ( KernelTransaction.Revertable ignore = tx.overrideWith( AccessMode.Static.READ ) )
{ {
BasicContext ctx = new BasicContext(); BasicContext ctx = new BasicContext();
ctx.put( Context.KERNEL_TRANSACTION, tx ); ctx.put( Context.KERNEL_TRANSACTION, tx );
Expand Down
Expand Up @@ -29,13 +29,9 @@
* cypher query language. * cypher query language.
* <p> * <p>
* Functions accept input, use that input to perform work, and then return a value. The work performed usually * Functions accept input, use that input to perform work, and then return a value. The work performed usually
* involves one or more resources, such as a {@link org.neo4j.graphdb.GraphDatabaseService}. * involves one or more resources, such as a {@link org.neo4j.graphdb.GraphDatabaseService}. Functions are read-only, i.e
* can't update neither the graph nor update schema.
* <p> * <p>
* A function is associated with one of the following modes
* READ allows only reading the graph (default mode)
* WRITE allows reading and writing the graph
* SCHEMA allows reading the graphs and performing schema operations
* DBMS allows managing the database (i.e. change password)
* *
* <h2>Input declaration</h2> * <h2>Input declaration</h2>
* A function can accept input arguments, which is defined in the arguments to the * A function can accept input arguments, which is defined in the arguments to the
Expand Down

0 comments on commit 5611917

Please sign in to comment.