-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement search updater as a hook (#4073)
* Implement search updater as a hook --------- Co-authored-by: Simon Dumas <[email protected]>
- Loading branch information
Showing
15 changed files
with
424 additions
and
351 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 100 additions & 0 deletions
100
.../bluebrain/nexus/delta/plugins/compositeviews/indexing/CompositeProjectionLifeCycle.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
package ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.indexing | ||
|
||
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.indexing.CompositeViewDef.ActiveViewDef | ||
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.projections.CompositeProjections | ||
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.stream.CompositeGraphStream | ||
import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.RemoteContextResolution | ||
import ch.epfl.bluebrain.nexus.delta.sourcing.stream.ExecutionStrategy.TransientSingleNode | ||
import ch.epfl.bluebrain.nexus.delta.sourcing.stream.{CompiledProjection, PipeChain} | ||
import monix.bio.Task | ||
|
||
/** | ||
* Handle the different life stages of a composite view projection | ||
*/ | ||
trait CompositeProjectionLifeCycle { | ||
|
||
/** | ||
* Initialise the projection related to the view | ||
*/ | ||
def init(view: ActiveViewDef): Task[Unit] | ||
|
||
/** | ||
* Build the projection related to the view, applying any matching hook If none, start the regular indexing | ||
*/ | ||
def build(view: ActiveViewDef): Task[CompiledProjection] | ||
|
||
/** | ||
* Destroy the projection related to the view | ||
*/ | ||
def destroy(view: ActiveViewDef): Task[Unit] | ||
} | ||
|
||
object CompositeProjectionLifeCycle { | ||
|
||
/** | ||
* Hook that allows to capture changes to apply before starting the indexing of a composite view | ||
*/ | ||
trait Hook { | ||
def apply(view: ActiveViewDef): Option[Task[Unit]] | ||
} | ||
|
||
/** | ||
* A default implementation that does nothing | ||
*/ | ||
val NoopHook: Hook = (_: ActiveViewDef) => None | ||
|
||
/** | ||
* Constructs the lifecycle of the projection of a composite view including building the projection itself and how to | ||
* create/destroy the namespaces and indices related to it | ||
*/ | ||
def apply( | ||
hooks: Set[Hook], | ||
compilePipeChain: PipeChain.Compile, | ||
graphStream: CompositeGraphStream, | ||
buildSpaces: ActiveViewDef => CompositeSpaces, | ||
compositeProjections: CompositeProjections | ||
)(implicit cr: RemoteContextResolution): CompositeProjectionLifeCycle = { | ||
def init(view: ActiveViewDef): Task[Unit] = buildSpaces(view).init | ||
|
||
def index(view: ActiveViewDef): Task[CompiledProjection] = | ||
CompositeViewDef.compile(view, buildSpaces(view), compilePipeChain, graphStream, compositeProjections) | ||
|
||
def destroy(view: ActiveViewDef): Task[Unit] = | ||
for { | ||
_ <- buildSpaces(view).destroy | ||
_ <- compositeProjections.deleteAll(view.ref, view.rev) | ||
} yield () | ||
|
||
apply(hooks, init, index, destroy) | ||
} | ||
|
||
private[indexing] def apply( | ||
hooks: Set[Hook], | ||
onInit: ActiveViewDef => Task[Unit], | ||
index: ActiveViewDef => Task[CompiledProjection], | ||
onDestroy: ActiveViewDef => Task[Unit] | ||
): CompositeProjectionLifeCycle = new CompositeProjectionLifeCycle { | ||
|
||
override def init(view: ActiveViewDef): Task[Unit] = onInit(view) | ||
|
||
override def build(view: ActiveViewDef): Task[CompiledProjection] = { | ||
detectHook(view).getOrElse { | ||
index(view) | ||
} | ||
} | ||
|
||
private def detectHook(view: ActiveViewDef) = { | ||
val initial: Option[Task[Unit]] = None | ||
hooks.toList | ||
.foldLeft(initial) { case (acc, hook) => | ||
(acc ++ hook(view)).reduceOption(_ >> _) | ||
} | ||
.map { task => | ||
Task.pure(CompiledProjection.fromTask(view.metadata, TransientSingleNode, task)) | ||
} | ||
} | ||
|
||
override def destroy(view: ActiveViewDef): Task[Unit] = onDestroy(view) | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.