blob: ab73ce98e8e720ecac7a4eae702f0516bcd6c7e6 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @author Jorge Bay Gondra
*/
import type { RemoteConnection } from '../driver/remote-connection.js';
import { Traversal } from './traversal.js';
export class TraversalStrategies {
readonly strategies: TraversalStrategy[];
/**
* Creates a new instance of TraversalStrategies.
* @param {TraversalStrategies} [parent] The parent strategies from where to clone the values from.
*/
constructor(parent?: TraversalStrategies) {
if (parent) {
// Clone the strategies
this.strategies = [...parent.strategies];
} else {
this.strategies = [];
}
}
/** @param {TraversalStrategy} strategy */
addStrategy(strategy: TraversalStrategy) {
this.strategies.push(strategy);
}
/** @param {TraversalStrategy} strategy */
removeStrategy(strategy: TraversalStrategy) {
const idx = this.strategies.findIndex((s) => s.strategyName === strategy.strategyName);
if (idx !== -1) {
return this.strategies.splice(idx, 1)[0];
}
return undefined;
}
/**
* @param {Traversal} traversal
* @returns {Promise}
*/
applyStrategies(traversal: Traversal) {
// Apply all strategies serially
return this.strategies.reduce(
(promise, strategy) => promise.then(() => strategy.apply(traversal)),
Promise.resolve(),
);
}
}
export type TraversalStrategyConfiguration = any;
export abstract class TraversalStrategy {
connection?: RemoteConnection;
public strategyName: string;
/**
* @param {TraversalStrategyConfiguration} configuration for the strategy
*/
constructor(
public configuration: TraversalStrategyConfiguration = {},
) {
this.strategyName = this.constructor.name;
}
/**
* @abstract
* @param {Traversal} traversal
* @returns {Promise}
*/
async apply(traversal: Traversal): Promise<void> {}
}
export class ConnectiveStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class ElementIdStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class HaltedTraverserStrategy extends TraversalStrategy {
/**
* @param {String} haltedTraverserFactory full qualified class name in Java of a `HaltedTraverserFactory` implementation
*/
constructor({haltedTraverserFactory = ""}) {
super({haltedTraverserFactory: haltedTraverserFactory});
}
}
export class MessagePassingReductionStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class OptionsStrategy extends TraversalStrategy {
constructor(options: TraversalStrategyConfiguration) {
super(options);
}
}
export class PartitionStrategy extends TraversalStrategy {
/**
* @param options
* @param options.partitionKey - name of the property key to partition by
* @param options.writePartition - the value of the currently write partition
* @param options.readPartitions - list of strings representing the partitions to include for reads
* @param options.includeMetaProperties - determines if meta-properties should be included in partitioning defaulting to false
*/
constructor({partitionKey, writePartition, readPartitions, includeMetaProperties}: {partitionKey?: string, writePartition?: string, readPartitions?: string[], includeMetaProperties?: boolean} = {}) {
const config: Record<string, any> = {};
if (partitionKey !== undefined) config.partitionKey = partitionKey;
if (writePartition !== undefined) config.writePartition = writePartition;
if (readPartitions !== undefined) config.readPartitions = readPartitions;
if (includeMetaProperties !== undefined) config.includeMetaProperties = includeMetaProperties;
super(config);
}
}
export class ProfileStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class SubgraphStrategy extends TraversalStrategy {
/**
* @param options
* @param options.vertices - traversal to filter vertices
* @param options.edges - traversal to filter edges
* @param options.vertexProperties - traversal to filter vertex properties
* @param options.checkAdjacentVertices - enables the strategy to apply the `vertices` filter to the adjacent vertices of an edge.
*/
constructor({vertices, edges, vertexProperties, checkAdjacentVertices}: {vertices?: any, edges?: any, vertexProperties?: any, checkAdjacentVertices?: boolean} = {}) {
const config: Record<string, any> = {};
if (vertices !== undefined) config.vertices = vertices instanceof Traversal ? vertices.gremlinLang : vertices;
if (edges !== undefined) config.edges = edges instanceof Traversal ? edges.gremlinLang : edges;
if (vertexProperties !== undefined) config.vertexProperties = vertexProperties instanceof Traversal ? vertexProperties.gremlinLang : vertexProperties;
if (checkAdjacentVertices !== undefined) config.checkAdjacentVertices = checkAdjacentVertices;
super(config);
}
}
export class ProductiveByStrategy extends TraversalStrategy {
/**
* @param options
* @param options.productiveKeys - set of keys that will always be productive
*/
constructor({productiveKeys = []} = {}) {
super({productiveKeys});
}
}
export class ReferenceElementStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class VertexProgramStrategy extends TraversalStrategy {
constructor(options: TraversalStrategyConfiguration) {
super(options);
}
}
export class MatchAlgorithmStrategy extends TraversalStrategy {
/**
* @param matchAlgorithm
*/
constructor({matchAlgorithm = ""}) {
super({matchAlgorithm: matchAlgorithm});
}
}
export class ComputerFinalizationStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class AdjacentToIncidentStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class FilterRankingStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class ByModulatorOptimizationStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class IdentityRemovalStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class IncidentToAdjacentStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class InlineFilterStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class LazyBarrierStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class MatchPredicateStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class OrderLimitStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class PathProcessorStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class PathRetractionStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class CountStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class RepeatUnrollStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class GraphFilterStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class EarlyLimitStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class ComputerVerificationStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class LambdaRestrictionStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class ReadOnlyStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class EdgeLabelVerificationStrategy extends TraversalStrategy {
/**
* @param options
* @param options.logWarnings - determines if warnings should be written to the logger when verification fails
* @param options.throwException - determines if exceptions should be thrown when verifications fails
*/
constructor({logWarnings = false, throwException = false} = {}) {
super({
logWarnings: logWarnings,
throwException: throwException,
});
}
}
export class ReservedKeysVerificationStrategy extends TraversalStrategy {
/**
* @param options
* @param options.logWarnings - determines if warnings should be written to the logger when verification fails
* @param options.throwException - determines if exceptions should be thrown when verifications fails
* @param options.keys - the list of reserved keys to verify
*/
constructor({ logWarnings = false, throwException = false, keys = ['id', 'label'] } = {}) {
super({
logWarnings: logWarnings,
throwException: throwException,
keys: keys,
});
}
}
export class VertexProgramRestrictionStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export class StandardVerificationStrategy extends TraversalStrategy {
constructor() {
super();
}
}
export type SeedStrategyOptions = { seed: number };
export class SeedStrategy extends TraversalStrategy {
/**
* @param {SeedStrategyOptions} [options]
* @param {number} [options.seed] the seed to provide to the random number generator for the traversal
*/
constructor(options: SeedStrategyOptions) {
super({
seed: options.seed,
});
}
}