-
Notifications
You must be signed in to change notification settings - Fork 30
/
property_filter.rb
114 lines (100 loc) · 2.86 KB
/
property_filter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
require 'pacer/filter/property_filter/filters'
require 'pacer/filter/property_filter/edge_filters'
module Pacer
class Route
class << self
def filters(graph, filters)
if filters? filters
filters
elsif filters? filters.first
filters.first
else
Pacer::Filter::PropertyFilter::Filters.new(graph, filters)
end
end
def edge_filters(graph, filters)
if filters? filters
filters
elsif filters? filters.first
filters.first
else
Pacer::Filter::PropertyFilter::EdgeFilters.new(graph, filters)
end
end
def filters?(filters)
filters.is_a? Pacer::Filter::PropertyFilter::Filters
end
def property_filter_before(base, args, block)
filters = Pacer::Route.edge_filters(base.graph, args)
filters.blocks = [block] if block
args = chain_args(filters)
if filters.extensions_only? and base.is_a? Route
yield base.chain_route(args)
elsif filters and filters.any?
yield base.chain_route(args.merge!(filter: :property, filters: filters))
else
yield base
end
end
def property_filter(base, args, block)
filters = Pacer::Route.edge_filters(base.graph, args)
filters.blocks = [block] if block
args = chain_args(filters)
if filters.extensions_only? and base.is_a? Route
base.chain_route(args)
elsif filters.any?
base.chain_route(args.merge!(filter: :property, filters: filters))
elsif base.is_a? Pacer::Wrappers::ElementWrapper
base.chain_route({})
else
base
end
end
def chain_args(filters)
if filters.wrapper or (filters.extensions and not filters.extensions.empty?)
{ extensions: filters.extensions, wrapper: filters.wrapper }
else
{}
end
end
end
end
module Filter
module PropertyFilter
#import com.tinkerpop.pipes.filter.LabelCollectionFilterPipe
import com.tinkerpop.gremlin.pipes.filter.PropertyFilterPipe
def filters=(f)
if f.is_a? Filters
@filters = f
else
@filters = EdgeFilters.new(graph, f)
end
end
# Return an array of filter options for the current route.
def filters
@filters ||= EdgeFilters.new(graph, nil)
end
def block=(block)
if block
filters.blocks = [block]
else
filters.blocks = []
end
end
def block
filters.blocks.first
end
protected
def build_pipeline
filters.build_pipeline(self, *pipe_source)
end
def inspect_string
if filters.any?
"#{inspect_class_name}(#{filters})"
else
inspect_class_name
end
end
end
end
end