/** * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed 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. * ============LICENSE_END========================================================= * * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.serialization.engines.query;/*- * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed 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. * ============LICENSE_END========================================================= */ /* package org.onap.aai.serialization.engines.query; import java.util.HashSet; import java.util.List; import java.util.Set; import org.onap.aai.db.AAIProperties; import org.onap.aai.query.builder.QueryBuilder; import org.onap.aai.serialization.engines.TransactionalGraphEngine; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.TransactionalGraph; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.gremlin.java.GremlinPipeline; import com.tinkerpop.pipes.IdentityPipe; import com.tinkerpop.pipes.PipeFunction; import com.tinkerpop.pipes.branch.LoopPipe; public class GremlinPipelineQueryEngine extends QueryEngine { public GremlinPipelineQueryEngine(TransactionalGraphEngine graphEngine) { super(graphEngine); } @Override public List executeQuery(TransactionalGraph g, QueryBuilder query) { List results = null; Vertex start = query.getStart(); if (start != null) { results = ((GremlinPipeline)query.getQuery()).cast(Vertex.class).toList(); } else { GremlinPipeline pipe = new GremlinPipeline(g); results = process(pipe, (GremlinPipeline)query.getQuery()); } return results; } @Override public List executeParentQuery(TransactionalGraph g, QueryBuilder query) { List results = null; Vertex start = query.getStart(); if (start != null) { results = ((GremlinPipeline)query.getParentQuery()).cast(Vertex.class).toList(); } else { GremlinPipeline pipe = new GremlinPipeline(g); results = process(pipe, (GremlinPipeline)query.getParentQuery()); } return results; } @Override public List findParents(Vertex start) { GremlinPipeline pipe = new GremlinPipeline(start).as("x").inE() .has("isParent", true).outV().loop("x", new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); return pipe.inE().has("isParent", true).count() == 1 || argument.getLoops() < 100; } }, new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { return true; } }); List results = pipe.toList(); results.add(0, start); return results; } @Override public List findChildren(Vertex start) { Set seen = new HashSet<>(); seen.add(start); GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().has("isParent", true).inV() .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); return pipe.outE().has("isParent", true).count() >= 1 || argument.getLoops() < 100; } }, new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { return true; } }); List results = pipe.toList(); results.add(0, start); return results; } @Override public List findDeletable(Vertex start) { Set seen = new HashSet<>(); seen.add(start); GremlinPipeline pipe = new GremlinPipeline(start).as("x").outE().or( new GremlinPipeline(new IdentityPipe()).has("isParent", true), new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).inV() .except(seen).store(seen).loop("x", new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { GremlinPipeline pipe = new GremlinPipeline<>(argument.getObject()); return pipe.outE().or( new GremlinPipeline(new IdentityPipe()).has("isParent", true), new GremlinPipeline(new IdentityPipe()).has("hasDelTarget", true)).count() >= 1 || argument.getLoops() < 100; } }, new PipeFunction, Boolean>() { @Override public Boolean compute(LoopPipe.LoopBundle argument) { return true; } }); List results = pipe.toList(); results.add(0, start); return results; } private List process(GremlinPipeline start, GremlinPipeline pipe) { return start.add(pipe).cast(Vertex.class).toList(); } @Override public List findRelatedVertices(Vertex start, Direction direction, String label, String nodeType) { GremlinPipeline pipe = new GremlinPipeline(start); switch (direction) { case OUT: pipe.out(label); break; case IN: pipe.in(label); break; case BOTH: pipe.both(label); break; default: break; } pipe.has(AAIProperties.NODE_TYPE, nodeType).dedup(); List result = pipe.toList(); return result; } } */