[ 
https://issues.apache.org/jira/browse/TINKERPOP-962?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15135275#comment-15135275
 ] 

ASF GitHub Bot commented on TINKERPOP-962:
------------------------------------------

Github user twilmes commented on a diff in the pull request:

    https://github.com/apache/incubator-tinkerpop/pull/210#discussion_r52088164
  
    --- Diff: 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphFilter.java
 ---
    @@ -0,0 +1,193 @@
    +/*
    + * 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.
    + */
    +
    +package org.apache.tinkerpop.gremlin.process.computer;
    +
    +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
    +import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
    +import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
    +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
    +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
    +import org.apache.tinkerpop.gremlin.structure.Direction;
    +import org.apache.tinkerpop.gremlin.structure.Edge;
    +import org.apache.tinkerpop.gremlin.structure.Vertex;
    +
    +import java.io.Serializable;
    +import java.util.Arrays;
    +import java.util.HashSet;
    +import java.util.Iterator;
    +import java.util.Set;
    +
    +/**
    + * GraphFilter is used by {@link GraphComputer} implementations to prune 
the source graph data being loaded into the OLAP system.
    + * There are two types of filters: a {@link Vertex} filter and an {@link 
Edge} filter.
    + * The vertex filter is a {@link Traversal} that can only check the id, 
label, and properties of the vertex.
    + * The edge filter is a {@link Traversal} that starts at the vertex are 
emits all legal incident edges.
    + * If no vertex filter is provided, then no vertices are filtered. If no 
edge filter is provided, then no edges are filtered.
    + * The use of a GraphFilter can greatly reduce the amount of data 
processed by the {@link GraphComputer}.
    + * For instance, for {@code g.V().count()}, there is no reason to load 
edges, and thus, the edge filter can be {@code bothE().limit(0)}.
    + *
    + * @author Marko A. Rodriguez (http://markorodriguez.com)
    + */
    +public final class GraphFilter implements Cloneable, Serializable {
    +
    +    public enum Legal {
    +        YES, NO, MAYBE;
    +
    +        public boolean positive() {
    +            return this != NO;
    +        }
    +
    +        public boolean negative() {
    +            return this == NO;
    +        }
    +    }
    +
    +    private Traversal.Admin<Vertex, Vertex> vertexFilter = null;
    +    private Traversal.Admin<Vertex, Edge> edgeFilter = null;
    +
    +    private boolean allowNoEdges = false;
    +    private Direction allowedEdgeDirection = Direction.BOTH;
    +    private Set<String> allowedEdgeLabels = new HashSet<>();
    +    //private boolean allowAllRemainingEdges = false;
    +
    +    public void setVertexFilter(final Traversal<Vertex, Vertex> 
vertexFilter) {
    +        if (!TraversalHelper.isLocalVertex(vertexFilter.asAdmin()))
    +            throw 
GraphComputer.Exceptions.vertexFilterAccessesIncidentEdges(vertexFilter);
    +        this.vertexFilter = vertexFilter.asAdmin().clone();
    +    }
    +
    +    public void setEdgeFilter(final Traversal<Vertex, Edge> edgeFilter) {
    +        if (!TraversalHelper.isLocalStarGraph(edgeFilter.asAdmin()))
    +            throw 
GraphComputer.Exceptions.edgeFilterAccessesAdjacentVertices(edgeFilter);
    +        this.edgeFilter = edgeFilter.asAdmin().clone();
    +        if (this.edgeFilter.getEndStep() instanceof RangeGlobalStep && 0 
== ((RangeGlobalStep) this.edgeFilter.getEndStep()).getHighRange())
    +            this.allowNoEdges = true;
    +        else if (this.edgeFilter.getStartStep() instanceof VertexStep) {
    +            this.allowedEdgeLabels.clear();
    +            this.allowedEdgeLabels.addAll(Arrays.asList(((VertexStep) 
this.edgeFilter.getStartStep()).getEdgeLabels()));
    +            this.allowedEdgeDirection = ((VertexStep) 
this.edgeFilter.getStartStep()).getDirection();
    +            //this.allowAllRemainingEdges = 1 == 
this.edgeFilter.getSteps().size();
    +        }
    +    }
    +
    +    /*public void compileFilters() {
    --- End diff --
    
    Did you mean to comment this out and remove calls to it? Figure you meant 
to but I recognized it from a previous commit.


> Provide "vertex query" selectivity when importing data in OLAP.
> ---------------------------------------------------------------
>
>                 Key: TINKERPOP-962
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-962
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: process
>    Affects Versions: 3.1.0-incubating
>            Reporter: Marko A. Rodriguez
>            Assignee: Marko A. Rodriguez
>              Labels: breaking
>             Fix For: 3.2.0-incubating
>
>
> Currently, when you do:
> {code}
> graph.compute().program(PageRankVertexProgram).submit()
> {code}
> We are pulling the entire {{graph}} into the OLAP engine. We should allow the 
> user to limit the amount of data pulled via "vertex query"-type filter. For 
> instance, we could support the following two new methods on {{GraphComputer}}.
> {code}
> graph.compute().program(PageRankVertexProgram).vertices(hasLabel('person')).edges(out,
>  hasLabel('knows','friend').has('weight',gt(0.8)).submit()
> {code}
> The two methods would be defined as:
> {code}
> public interface GraphComputer {
> ...
> GraphComputer vertices(final Traversal<Vertex,Vertex> vertexFilter)
> GraphComputer edges(final Direction direction, final Traversal<Edge,Edge> 
> edgeFilter)
> {code}
> If the user does NOT provide a {{vertices()}} (or {{edges()}}) call, then the 
> {{Traversal}} is assumed to be {{IdentityTraversal}}. Finally, in terms of 
> execution order, first {{vertices()}} is called and if "false" then don't 
> call edges. Else, call edges on all the respective incoming and outgoing 
> edges. Don't really like {{Direction}} there and perhaps its just:
> {code}
> GraphComputer edges(final Traversal<Vertex,Edge> edgeFilter)
> {code}
> And then all edges that pass through are added to OLAP vertex. You don't want 
> {{both}}? Then its {{outE('knows',friend').has('weight',gt(0.8))}}.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to