neo4j 1.0.0.beta.22-java → 1.0.0.beta.23-java
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/neo4j.rb +2 -0
- data/lib/neo4j/index/class_methods.rb +16 -0
- data/lib/neo4j/index/indexer.rb +6 -2
- data/lib/neo4j/index/lucene_query.rb +71 -29
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +2 -2
- data/lib/neo4j/mapping/has_list.rb +21 -2
- data/lib/neo4j/mapping/has_n.rb +21 -0
- data/lib/neo4j/mapping/node_mixin.rb +1 -0
- data/lib/neo4j/node_traverser.rb +19 -0
- data/lib/neo4j/rails/finders.rb +115 -114
- data/lib/neo4j/version.rb +1 -1
- data/lib/tmp/neo4j/index.db +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Person-exact/_0.cfs +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Person-exact/_1.cfs +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Person-exact/segments.gen +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Person-exact/segments_3 +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Thing-exact/_0.cfs +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Thing-exact/segments.gen +0 -0
- data/lib/tmp/neo4j/index/lucene/node/Thing-exact/segments_2 +0 -0
- data/lib/tmp/neo4j/messages.log +42 -0
- data/lib/tmp/neo4j/neostore +0 -0
- data/lib/tmp/neo4j/neostore.nodestore.db +0 -0
- data/lib/tmp/neo4j/neostore.nodestore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.keys +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.keys.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.strings +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.strings.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshipstore.db +0 -0
- data/lib/tmp/neo4j/neostore.relationshipstore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names.id +0 -0
- data/lib/tmp/neo4j/tm_tx_log.1 +0 -0
- data/neo4j.gemspec +1 -0
- metadata +27 -5
data/lib/neo4j.rb
CHANGED
@@ -11,6 +11,8 @@ require 'neo4j/jars/neo4j-lucene-index-0.2-1.2.M04.jar'
|
|
11
11
|
require 'neo4j/jars/geronimo-jta_1.1_spec-1.1.1.jar'
|
12
12
|
require 'neo4j/jars/lucene-core-3.0.2.jar'
|
13
13
|
|
14
|
+
require 'will_paginate/collection'
|
15
|
+
require 'will_paginate/finders/base'
|
14
16
|
require 'neo4j/to_java'
|
15
17
|
require 'neo4j/version'
|
16
18
|
require 'neo4j/equal'
|
@@ -5,6 +5,22 @@ module Neo4j
|
|
5
5
|
|
6
6
|
extend Forwardable
|
7
7
|
|
8
|
+
def wp_query(options, pager, args, &block) #:nodoc:
|
9
|
+
params = {}
|
10
|
+
params[:page] = pager.current_page
|
11
|
+
params[:per_page] = pager.per_page
|
12
|
+
query = if args.empty?
|
13
|
+
find(options, params, &block)
|
14
|
+
else
|
15
|
+
args << params.merge(options)
|
16
|
+
find(*args, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
pager.replace [*query]
|
20
|
+
pager.total_entries = query.size
|
21
|
+
end
|
22
|
+
|
23
|
+
|
8
24
|
##
|
9
25
|
# See Neo4j::Index::Indexer#index
|
10
26
|
# Forwards to the indexer that should be used.
|
data/lib/neo4j/index/indexer.rb
CHANGED
@@ -90,7 +90,6 @@ module Neo4j
|
|
90
90
|
conf.delete :via # avoid endless recursion
|
91
91
|
via_indexer.index(field, conf)
|
92
92
|
else
|
93
|
-
# raise "Already defined an (via?) index on #{field}, Using the same index for from two classes ? Check index :#{field}, :via => :#{@indexer_for}" if @field_types[field.to_s]
|
94
93
|
@field_types[field.to_s] = conf[:type] || :exact
|
95
94
|
end
|
96
95
|
end
|
@@ -238,7 +237,12 @@ module Neo4j
|
|
238
237
|
@decl_props ||= @indexer_for.respond_to?(:_decl_props) && @indexer_for._decl_props
|
239
238
|
|
240
239
|
index = index_for_type(params[:type] || :exact)
|
241
|
-
query
|
240
|
+
if query.is_a?(Hash) && (query.include?(:conditions) || query.include?(:sort))
|
241
|
+
params.merge! query.except(:conditions)
|
242
|
+
query.delete(:sort)
|
243
|
+
query = query.delete(:conditions) if query.include?(:conditions)
|
244
|
+
end
|
245
|
+
query = (params[:wrapped].nil? || params[:wrapped]) ? LuceneQuery.new(index, @decl_props, query, params) : index.query(query)
|
242
246
|
|
243
247
|
if block_given?
|
244
248
|
begin
|
@@ -37,17 +37,45 @@ module Neo4j
|
|
37
37
|
#
|
38
38
|
class LuceneQuery
|
39
39
|
include Enumerable
|
40
|
+
include WillPaginate::Finders::Base
|
40
41
|
attr_accessor :left_and_query, :left_or_query
|
41
|
-
|
42
|
-
def initialize(index, decl_props, query)
|
43
|
-
@index
|
44
|
-
@query
|
42
|
+
|
43
|
+
def initialize(index, decl_props, query, params={})
|
44
|
+
@index = index
|
45
|
+
@query = query
|
45
46
|
@decl_props = decl_props
|
47
|
+
@params = params
|
48
|
+
|
49
|
+
if params.include?(:sort)
|
50
|
+
@order = {}
|
51
|
+
params[:sort].each_pair { |k, v| @order[k] = (v == :desc) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def wp_query(options, pager, args, &block) #:nodoc:
|
56
|
+
@params[:page] = pager.current_page
|
57
|
+
@params[:per_page] = pager.per_page
|
58
|
+
pager.replace [*self]
|
59
|
+
pager.total_entries = size
|
46
60
|
end
|
47
61
|
|
48
62
|
# Since we include the Ruby Enumerable mixin we need this method.
|
49
63
|
def each
|
50
|
-
|
64
|
+
if @params.include?(:per_page)
|
65
|
+
# paginate the result, used by the will_paginate gem
|
66
|
+
page = @params[:page] || 1
|
67
|
+
per_page = @params[:per_page]
|
68
|
+
to = per_page * page
|
69
|
+
from = to - per_page
|
70
|
+
i = 0
|
71
|
+
hits.each do |node|
|
72
|
+
yield node.wrapper if i >= from
|
73
|
+
i += 1
|
74
|
+
break if i >= to
|
75
|
+
end
|
76
|
+
else
|
77
|
+
hits.each { |n| yield n.wrapper }
|
78
|
+
end
|
51
79
|
end
|
52
80
|
|
53
81
|
# Close hits
|
@@ -71,7 +99,7 @@ module Neo4j
|
|
71
99
|
# Does simply loop all search items till the n'th is found.
|
72
100
|
#
|
73
101
|
def [](index)
|
74
|
-
each_with_index {|node,i| break node if index == i}
|
102
|
+
each_with_index { |node, i| break node if index == i }
|
75
103
|
end
|
76
104
|
|
77
105
|
# Returns the number of search hits
|
@@ -90,25 +118,30 @@ module Neo4j
|
|
90
118
|
raise "Expected a symbol. Syntax for range queries example: index(:weight).between(a,b)" unless Symbol === @query
|
91
119
|
raise "Can't only do range queries on Neo4j::NodeMixin, Neo4j::Model, Neo4j::RelationshipMixin" unless @decl_props
|
92
120
|
# check that we perform a range query on the same values as we have declared with the property :key, :type => ...
|
93
|
-
type
|
121
|
+
type = @decl_props[@query] && @decl_props[@query][:type]
|
94
122
|
raise "find(#{@query}).between(#{lower}, #{upper}): #{lower} not a #{type}" if type && !type === lower.class
|
95
123
|
raise "find(#{@query}).between(#{lower}, #{upper}): #{upper} not a #{type}" if type && !type === upper.class
|
96
124
|
|
97
125
|
# Make it possible to convert those values
|
98
|
-
|
99
|
-
upper = TypeConverters.convert(upper)
|
100
|
-
|
101
|
-
@query = case lower
|
102
|
-
when Fixnum
|
103
|
-
org.apache.lucene.search.NumericRangeQuery.new_long_range(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
104
|
-
when Float
|
105
|
-
org.apache.lucene.search.NumericRangeQuery.new_double_range(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
106
|
-
else
|
107
|
-
org.apache.lucene.search.TermRangeQuery.new(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
108
|
-
end
|
126
|
+
@query = range_query(@query, lower, upper, lower_incusive, upper_inclusive)
|
109
127
|
self
|
110
128
|
end
|
111
129
|
|
130
|
+
def range_query(field, lower, upper, lower_incusive, upper_inclusive)
|
131
|
+
lower = TypeConverters.convert(lower)
|
132
|
+
upper = TypeConverters.convert(upper)
|
133
|
+
|
134
|
+
case lower
|
135
|
+
when Fixnum
|
136
|
+
org.apache.lucene.search.NumericRangeQuery.new_long_range(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
137
|
+
when Float
|
138
|
+
org.apache.lucene.search.NumericRangeQuery.new_double_range(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
139
|
+
else
|
140
|
+
org.apache.lucene.search.TermRangeQuery.new(field.to_s, lower, upper, lower_incusive, upper_inclusive)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
|
112
145
|
# Create a compound lucene query.
|
113
146
|
#
|
114
147
|
# ==== Parameters
|
@@ -119,7 +152,7 @@ module Neo4j
|
|
119
152
|
# Person.find(:name=>'kalle').and(:age => 3)
|
120
153
|
#
|
121
154
|
def and(query2)
|
122
|
-
new_query
|
155
|
+
new_query = LuceneQuery.new(@index, @decl_props, query2)
|
123
156
|
new_query.left_and_query = self
|
124
157
|
new_query
|
125
158
|
end
|
@@ -145,7 +178,7 @@ module Neo4j
|
|
145
178
|
and_query
|
146
179
|
end
|
147
180
|
|
148
|
-
def build_sort_query(query)
|
181
|
+
def build_sort_query(query) #:nodoc:
|
149
182
|
java_sort_fields = @order.keys.inject([]) do |memo, field|
|
150
183
|
decl_type = @decl_props && @decl_props[field] && @decl_props[field][:type]
|
151
184
|
type = case
|
@@ -162,19 +195,28 @@ module Neo4j
|
|
162
195
|
org.neo4j.index.impl.lucene.QueryContext.new(query).sort(sort)
|
163
196
|
end
|
164
197
|
|
165
|
-
def build_hash_query(query)
|
166
|
-
and_query
|
198
|
+
def build_hash_query(query) #:nodoc:
|
199
|
+
and_query = org.apache.lucene.search.BooleanQuery.new
|
167
200
|
|
168
201
|
query.each_pair do |key, value|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
202
|
+
type = @decl_props[key.to_sym] && @decl_props[key.to_sym][:type]
|
203
|
+
if !type.nil? && type != String
|
204
|
+
if Range === value
|
205
|
+
and_query.add(range_query(key, value.first, value.last, true, !value.exclude_end?), org.apache.lucene.search.BooleanClause::Occur::MUST)
|
206
|
+
else
|
207
|
+
and_query.add(range_query(key, value, value, true, true), org.apache.lucene.search.BooleanClause::Occur::MUST)
|
208
|
+
end
|
209
|
+
else
|
210
|
+
conv_value = type ? TypeConverters.convert(value) : value.to_s
|
211
|
+
term = org.apache.lucene.index.Term.new(key.to_s, conv_value)
|
212
|
+
term_query = org.apache.lucene.search.TermQuery.new(term)
|
213
|
+
and_query.add(term_query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
214
|
+
end
|
173
215
|
end
|
174
216
|
and_query
|
175
217
|
end
|
176
|
-
|
177
|
-
def build_query
|
218
|
+
|
219
|
+
def build_query #:nodoc:
|
178
220
|
query = @query
|
179
221
|
query = build_hash_query(query) if Hash === query
|
180
222
|
query = build_and_query(query) if @left_and_query
|
@@ -182,7 +224,7 @@ module Neo4j
|
|
182
224
|
query
|
183
225
|
end
|
184
226
|
|
185
|
-
def perform_query
|
227
|
+
def perform_query #:nodoc:
|
186
228
|
@index.query(build_query)
|
187
229
|
end
|
188
230
|
end
|
@@ -51,11 +51,11 @@ module Neo4j::Mapping
|
|
51
51
|
@has_one
|
52
52
|
end
|
53
53
|
|
54
|
-
def each_node(node, direction, &block) #:nodoc:
|
54
|
+
def each_node(node, direction, raw = false, &block) #:nodoc:
|
55
55
|
type = type_to_java(rel_type)
|
56
56
|
dir = dir_to_java(direction)
|
57
57
|
node._java_node.getRelationships(type, dir).each do |rel|
|
58
|
-
other = rel.getOtherNode(node).wrapper
|
58
|
+
other = raw ? rel.getOtherNode(node) : rel.getOtherNode(node).wrapper
|
59
59
|
block.call other
|
60
60
|
end
|
61
61
|
end
|
@@ -34,6 +34,8 @@ module Neo4j
|
|
34
34
|
class HasList
|
35
35
|
include Enumerable
|
36
36
|
include ToJava
|
37
|
+
include WillPaginate::Finders::Base
|
38
|
+
|
37
39
|
|
38
40
|
def initialize(node, name)
|
39
41
|
@time_line = org.neo4j.index.timeline.Timeline.new(name, node._java_node, true, Neo4j.started_db.graph)
|
@@ -102,12 +104,29 @@ module Neo4j
|
|
102
104
|
# person.feeds.each {|node| node}
|
103
105
|
#
|
104
106
|
def each
|
105
|
-
@time_line.all_nodes.iterator.each
|
107
|
+
@time_line.all_nodes.iterator.each do |node|
|
106
108
|
if @raw then
|
107
109
|
yield node
|
108
110
|
else
|
109
111
|
yield node.wrapper
|
110
|
-
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def wp_query(options, pager, args, &block) #:nodoc:
|
117
|
+
@raw = true
|
118
|
+
page = pager.current_page || 1
|
119
|
+
to = pager.per_page * page
|
120
|
+
from = to - pager.per_page
|
121
|
+
i = 0
|
122
|
+
res = []
|
123
|
+
each do |node|
|
124
|
+
res << node.wrapper if i >= from
|
125
|
+
i += 1
|
126
|
+
break if i >= to
|
127
|
+
end
|
128
|
+
pager.replace res
|
129
|
+
pager.total_entries ||= size
|
111
130
|
end
|
112
131
|
|
113
132
|
# If called then it will only return the raw java nodes and not the Ruby wrappers using the Neo4j::NodeMixin
|
data/lib/neo4j/mapping/has_n.rb
CHANGED
@@ -12,6 +12,8 @@ module Neo4j
|
|
12
12
|
#
|
13
13
|
class HasN
|
14
14
|
include Enumerable
|
15
|
+
include WillPaginate::Finders::Base
|
16
|
+
|
15
17
|
include ToJava
|
16
18
|
|
17
19
|
def initialize(node, dsl) # :nodoc:
|
@@ -46,6 +48,25 @@ module Neo4j
|
|
46
48
|
@dsl.each_node(@node, @direction, &block)
|
47
49
|
end
|
48
50
|
|
51
|
+
# returns none wrapped nodes, you may get better performance using this method
|
52
|
+
def _each(&block)
|
53
|
+
@dsl.each_node(@node, @direction, true, &block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def wp_query(options, pager, args, &block) #:nodoc:
|
57
|
+
page = pager.current_page || 1
|
58
|
+
to = pager.per_page * page
|
59
|
+
from = to - pager.per_page
|
60
|
+
i = 0
|
61
|
+
res = []
|
62
|
+
_each do |node|
|
63
|
+
res << node.wrapper if i >= from
|
64
|
+
i += 1
|
65
|
+
break if i >= to
|
66
|
+
end
|
67
|
+
pager.replace res
|
68
|
+
pager.total_entries ||= self.size # TODO, this could be very slow to do
|
69
|
+
end
|
49
70
|
|
50
71
|
# Returns true if there are no node in this type of relationship
|
51
72
|
def empty?
|
data/lib/neo4j/node_traverser.rb
CHANGED
@@ -37,6 +37,8 @@ module Neo4j
|
|
37
37
|
class NodeTraverser
|
38
38
|
include Enumerable
|
39
39
|
include ToJava
|
40
|
+
include WillPaginate::Finders::Base
|
41
|
+
|
40
42
|
|
41
43
|
def initialize(from, type = nil, dir=nil)
|
42
44
|
@from = from
|
@@ -55,6 +57,23 @@ module Neo4j
|
|
55
57
|
"NodeTraverser [from: #{@from.neo_id} depth: #{@depth} type: #{@type} dir:#{@dir}"
|
56
58
|
end
|
57
59
|
|
60
|
+
|
61
|
+
def wp_query(options, pager, args, &block) #:nodoc:
|
62
|
+
page = pager.current_page || 1
|
63
|
+
per_page = pager.per_page
|
64
|
+
to = per_page * page
|
65
|
+
from = to - per_page
|
66
|
+
i = 0
|
67
|
+
res = []
|
68
|
+
iterator.each do |node|
|
69
|
+
res << node.wrapper if i >= from
|
70
|
+
i += 1
|
71
|
+
break if i >= to
|
72
|
+
end
|
73
|
+
pager.replace res
|
74
|
+
pager.total_entries ||= size # TODO, this could be very slow to do
|
75
|
+
end
|
76
|
+
|
58
77
|
def <<(other_node)
|
59
78
|
new(other_node)
|
60
79
|
self
|
data/lib/neo4j/rails/finders.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Neo4j
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
module Rails
|
3
|
+
module Finders
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
rule :_all
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
# overwrite the index method to add find_by_xxx class methods
|
12
|
+
def index(*args)
|
13
|
+
field = args.first
|
14
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
15
15
|
def self.all_by_#{field}(value)
|
16
16
|
find_with_indexer("#{field}: \\"\#{value}\\"")
|
17
17
|
end
|
@@ -19,13 +19,13 @@ module Neo4j
|
|
19
19
|
def self.find_by_#{field}(value)
|
20
20
|
all_by_#{field}(value).first
|
21
21
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
RUBY
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
# load an id or array of ids from the database
|
28
|
+
def load(*ids)
|
29
29
|
result = ids.map { |id| Neo4j::Node.load(id) }
|
30
30
|
if ids.length == 1
|
31
31
|
result.first
|
@@ -33,102 +33,103 @@ module Neo4j
|
|
33
33
|
result
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
# Model.find(:all, { :name => "test" })
|
58
|
-
|
59
|
-
# Model.find(:all, :conditions => "name: test")
|
60
|
-
# Model.find(:all, :conditions => { :name => "test" })
|
36
|
+
|
37
|
+
# Behave like the ActiveRecord query interface
|
38
|
+
#
|
39
|
+
# === Example
|
40
|
+
#
|
41
|
+
# Handle Model.find(params[:id])
|
42
|
+
# Model.find
|
43
|
+
# Model.find(:first)
|
44
|
+
# Model.find("1")
|
45
|
+
# Model.find(1)
|
46
|
+
# Model.find("name: test")
|
47
|
+
# Model.find(:name => "test")
|
48
|
+
# Model.find(:first, "name: test")
|
49
|
+
# Model.find(:first, { :name => "test" })
|
50
|
+
# Model.find(:first, :conditions => "name: test")
|
51
|
+
# Model.find(:first, :conditions => { :name => "test" })
|
52
|
+
# Model.find(:all, "name: test")
|
53
|
+
# Model.find(:all, { :name => "test" })
|
54
|
+
# Model.find(:all, :conditions => "name: test")
|
55
|
+
# Model.find(:all, :conditions => { :name => "test" })
|
56
|
+
#
|
61
57
|
def find(*args)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
58
|
+
case args.first
|
59
|
+
when :all, :first
|
60
|
+
kind = args.shift
|
61
|
+
send(kind, *args)
|
62
|
+
else
|
63
|
+
find_with_ids(*args) or first(*args)
|
64
|
+
end
|
69
65
|
end
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
66
|
+
|
67
|
+
def all(*args)
|
68
|
+
if !conditions_in?(*args)
|
69
|
+
# use the _all rule to recover all the stored instances of this node
|
70
|
+
_all
|
71
|
+
else
|
72
|
+
# handle the special case of a search by id
|
73
|
+
ids = ids_in(args.first)
|
74
|
+
if ids
|
75
|
+
[find_with_ids(ids)].flatten
|
76
|
+
else
|
77
|
+
find_with_indexer(*args)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def first(*args)
|
83
|
+
all(*args).first
|
84
|
+
end
|
85
|
+
|
86
|
+
def last(*args)
|
87
|
+
a = all(*args)
|
88
|
+
a.empty? ? nil : a[a.size - 1]
|
89
|
+
end
|
90
|
+
|
91
|
+
def count
|
92
|
+
all.size
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
def ids_in(arg)
|
98
|
+
return nil unless arg.is_a?(Hash)
|
99
|
+
arg[:conditions].present? ? arg[:conditions][:id] : arg[:id]
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def conditions_in?(*args)
|
104
|
+
return false if args.empty?
|
105
|
+
|
106
|
+
# does it contain an string, which will be treated like a condition ?
|
107
|
+
return true if args.find { |a| a.is_a?(String) }
|
108
|
+
|
109
|
+
# does it contain an empty conditions param ?
|
110
|
+
hash = args.find { |a| a.is_a?(Hash) }
|
111
|
+
return false if hash.include?(:conditions) && hash[:conditions].empty?
|
112
|
+
|
113
|
+
# does it contain only paging or sorting params ?
|
114
|
+
!hash.except(:sort, :page, :per_page).empty?
|
115
|
+
end
|
116
|
+
|
117
|
+
def find_with_ids(*args)
|
118
|
+
if ((args.first.is_a?(String) || args.first.is_a?(Integer)) && args.first.to_i > 0)
|
119
|
+
load(*args.map { |p| p.to_i })
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def find_with_indexer(*args)
|
124
|
+
hits = _indexer.find(*args)
|
125
|
+
# We need to save this so that the Rack Neo4j::Rails:LuceneConnection::Closer can close it
|
126
|
+
Thread.current[:neo4j_lucene_connection] ||= []
|
127
|
+
Thread.current[:neo4j_lucene_connection] << hits
|
128
|
+
hits
|
129
|
+
end
|
130
|
+
|
130
131
|
end
|
131
|
-
|
132
|
-
|
132
|
+
end
|
133
|
+
end
|
133
134
|
end
|
134
135
|
|
data/lib/neo4j/version.rb
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/tmp/neo4j/messages.log
CHANGED
@@ -132,3 +132,45 @@ Thu Nov 25 14:38:03 CET 2010: Closed log tmp/neo4j/lucene/lucene.log
|
|
132
132
|
Thu Nov 25 14:38:03 CET 2010: NeoStore closed
|
133
133
|
Thu Nov 25 14:38:03 CET 2010: Closed log tmp/neo4j/lucene-fulltext/lucene.log
|
134
134
|
Thu Nov 25 14:38:03 CET 2010: TM shutting down
|
135
|
+
Thu Dec 02 10:15:07 CET 2010: Opened [tmp/neo4j/nioneo_logical.log.1] clean empty log, version=0
|
136
|
+
Thu Dec 02 10:15:07 CET 2010: Opened [tmp/neo4j/lucene/lucene.log.1] clean empty log, version=0
|
137
|
+
Thu Dec 02 10:15:07 CET 2010: Opened [tmp/neo4j/lucene-fulltext/lucene.log.1] clean empty log, version=0
|
138
|
+
Thu Dec 02 10:15:07 CET 2010: Opened [/home/andreas/projects/neo4j/lib/tmp/neo4j/index/lucene.log.1] clean empty log, version=0
|
139
|
+
Thu Dec 02 10:15:07 CET 2010: Extension org.neo4j.graphdb.index.IndexProvider[lucene] initialized ok
|
140
|
+
Thu Dec 02 10:15:07 CET 2010: TM opening log: tmp/neo4j/tm_tx_log.1
|
141
|
+
Thu Dec 02 10:15:07 CET 2010: --- CONFIGURATION START ---
|
142
|
+
Thu Dec 02 10:15:07 CET 2010: Physical mem: 4017MB, Heap size: 483MB
|
143
|
+
Thu Dec 02 10:15:07 CET 2010: Kernel version: Neo4j - Graph Database Kernel 1.2-1.2.M04
|
144
|
+
Thu Dec 02 10:15:07 CET 2010: Operating System: Linux; version: 2.6.32-26-generic-pae; arch: i386
|
145
|
+
Thu Dec 02 10:15:07 CET 2010: VM Name: Java HotSpot(TM) Client VM
|
146
|
+
Thu Dec 02 10:15:07 CET 2010: VM Vendor: Sun Microsystems Inc.
|
147
|
+
Thu Dec 02 10:15:07 CET 2010: VM Version: 17.1-b03
|
148
|
+
Thu Dec 02 10:15:07 CET 2010: Boot Class Path: /usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/resources.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/rt.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/jsse.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/jce.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/charsets.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/classes:/home/andreas/.rvm/rubies/jruby-1.5.5/lib/jruby.jar
|
149
|
+
Thu Dec 02 10:15:07 CET 2010: Class Path: :
|
150
|
+
Thu Dec 02 10:15:07 CET 2010: Library Path: /usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.22/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
|
151
|
+
Thu Dec 02 10:15:07 CET 2010: Garbage Collector: Copy: [Eden Space, Survivor Space]
|
152
|
+
Thu Dec 02 10:15:07 CET 2010: Garbage Collector: MarkSweepCompact: [Eden Space, Survivor Space, Tenured Gen, Perm Gen, Perm Gen [shared-ro], Perm Gen [shared-rw]]
|
153
|
+
Thu Dec 02 10:15:07 CET 2010: VM Arguments: [-Djruby.memory.max=500m, -Djruby.stack.max=1024k, -Xmx500m, -Xss1024k, -Djffi.boot.library.path=/home/andreas/.rvm/rubies/jruby-1.5.5/lib/native/i386-Linux:/home/andreas/.rvm/rubies/jruby-1.5.5/lib/native/ppc-Linux:/home/andreas/.rvm/rubies/jruby-1.5.5/lib/native/x86_64-Linux, -Xbootclasspath/a:/home/andreas/.rvm/rubies/jruby-1.5.5/lib/jruby.jar, -Djruby.home=/home/andreas/.rvm/rubies/jruby-1.5.5, -Djruby.lib=/home/andreas/.rvm/rubies/jruby-1.5.5/lib, -Djruby.script=jruby, -Djruby.shell=/bin/sh]
|
154
|
+
Thu Dec 02 10:15:07 CET 2010:
|
155
|
+
Thu Dec 02 10:15:07 CET 2010: create=true
|
156
|
+
Thu Dec 02 10:15:07 CET 2010: dir=tmp/neo4j/lucene-fulltext
|
157
|
+
Thu Dec 02 10:15:07 CET 2010: logical_log=tmp/neo4j/nioneo_logical.log
|
158
|
+
Thu Dec 02 10:15:07 CET 2010: neo_store=tmp/neo4j/neostore
|
159
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.nodestore.db.mapped_memory=20M
|
160
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.propertystore.db.arrays.mapped_memory=130M
|
161
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.propertystore.db.index.keys.mapped_memory=1M
|
162
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.propertystore.db.index.mapped_memory=1M
|
163
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.propertystore.db.mapped_memory=90M
|
164
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.propertystore.db.strings.mapped_memory=130M
|
165
|
+
Thu Dec 02 10:15:07 CET 2010: neostore.relationshipstore.db.mapped_memory=100M
|
166
|
+
Thu Dec 02 10:15:07 CET 2010: rebuild_idgenerators_fast=true
|
167
|
+
Thu Dec 02 10:15:07 CET 2010: store_dir=tmp/neo4j
|
168
|
+
Thu Dec 02 10:15:07 CET 2010: --- CONFIGURATION END ---
|
169
|
+
Thu Dec 02 10:15:07 CET 2010: Extension org.neo4j.graphdb.index.IndexProvider[lucene] loaded ok
|
170
|
+
Thu Dec 02 11:54:16 CET 2010: Closed log tmp/neo4j/nioneo_logical.log
|
171
|
+
Thu Dec 02 11:54:16 CET 2010: NeoStore closed
|
172
|
+
Thu Dec 02 11:54:16 CET 2010: Closed log /home/andreas/projects/neo4j/lib/tmp/neo4j/index/lucene.log
|
173
|
+
Thu Dec 02 11:54:16 CET 2010: Closed log tmp/neo4j/lucene/lucene.log
|
174
|
+
Thu Dec 02 11:54:16 CET 2010: NeoStore closed
|
175
|
+
Thu Dec 02 11:54:16 CET 2010: Closed log tmp/neo4j/lucene-fulltext/lucene.log
|
176
|
+
Thu Dec 02 11:54:16 CET 2010: TM shutting down
|
data/lib/tmp/neo4j/neostore
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/tmp/neo4j/tm_tx_log.1
CHANGED
Binary file
|
data/neo4j.gemspec
CHANGED
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 1.0.0.beta.
|
10
|
+
- 23
|
11
|
+
version: 1.0.0.beta.23
|
12
12
|
platform: java
|
13
13
|
authors:
|
14
14
|
- Andreas Ronge
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-
|
19
|
+
date: 2010-12-03 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -48,9 +48,23 @@ dependencies:
|
|
48
48
|
type: :runtime
|
49
49
|
version_requirements: *id002
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
51
|
+
name: will_paginate
|
52
52
|
prerelease: false
|
53
53
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 3
|
59
|
+
- 0
|
60
|
+
- pre
|
61
|
+
version: 3.0.pre
|
62
|
+
type: :runtime
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: railties
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
54
68
|
requirements:
|
55
69
|
- - ">="
|
56
70
|
- !ruby/object:Gem::Version
|
@@ -60,7 +74,7 @@ dependencies:
|
|
60
74
|
- 0
|
61
75
|
version: 3.0.0
|
62
76
|
type: :runtime
|
63
|
-
version_requirements: *
|
77
|
+
version_requirements: *id004
|
64
78
|
description: "You can think of Neo4j as a high-performance graph engine with all the features of a mature and robust database.\n\
|
65
79
|
The programmer works with an object-oriented, flexible network structure rather than with strict and static tables \xE2\x80\x94 yet enjoys all the benefits of a fully transactional, enterprise-strength database.\n\
|
66
80
|
It comes included with the Apache Lucene document database.\n"
|
@@ -96,6 +110,7 @@ files:
|
|
96
110
|
- lib/tmp/neo4j/neostore.relationshipstore.db
|
97
111
|
- lib/tmp/neo4j/neostore.propertystore.db.index.id
|
98
112
|
- lib/tmp/neo4j/neostore.propertystore.db.id
|
113
|
+
- lib/tmp/neo4j/index.db
|
99
114
|
- lib/tmp/neo4j/neostore.propertystore.db
|
100
115
|
- lib/tmp/neo4j/tm_tx_log.1
|
101
116
|
- lib/tmp/neo4j/neostore.relationshiptypestore.db
|
@@ -105,6 +120,13 @@ files:
|
|
105
120
|
- lib/tmp/neo4j/lucene-fulltext/lucene.log.active
|
106
121
|
- lib/tmp/neo4j/index/lucene-store.db
|
107
122
|
- lib/tmp/neo4j/index/lucene.log.active
|
123
|
+
- lib/tmp/neo4j/index/lucene/node/Person-exact/segments.gen
|
124
|
+
- lib/tmp/neo4j/index/lucene/node/Person-exact/_1.cfs
|
125
|
+
- lib/tmp/neo4j/index/lucene/node/Person-exact/_0.cfs
|
126
|
+
- lib/tmp/neo4j/index/lucene/node/Person-exact/segments_3
|
127
|
+
- lib/tmp/neo4j/index/lucene/node/Thing-exact/segments.gen
|
128
|
+
- lib/tmp/neo4j/index/lucene/node/Thing-exact/segments_2
|
129
|
+
- lib/tmp/neo4j/index/lucene/node/Thing-exact/_0.cfs
|
108
130
|
- lib/tmp/neo4j/lucene/lucene-store.db
|
109
131
|
- lib/tmp/neo4j/lucene/lucene.log.active
|
110
132
|
- lib/neo4j/event_handler.rb
|