neo4j-cypher 1.0.0.rc2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/README.rdoc +28 -77
- data/lib/neo4j-cypher.rb +3 -1
- data/lib/neo4j-cypher/abstract_filter.rb +78 -0
- data/lib/neo4j-cypher/argument.rb +0 -1
- data/lib/neo4j-cypher/clause.rb +39 -1
- data/lib/neo4j-cypher/clause_list.rb +30 -15
- data/lib/neo4j-cypher/collection.rb +14 -0
- data/lib/neo4j-cypher/context.rb +27 -27
- data/lib/neo4j-cypher/create.rb +0 -3
- data/lib/neo4j-cypher/foreach.rb +16 -0
- data/lib/neo4j-cypher/match.rb +21 -18
- data/lib/neo4j-cypher/neography.rb +22 -0
- data/lib/neo4j-cypher/node_var.rb +0 -1
- data/lib/neo4j-cypher/operator.rb +4 -10
- data/lib/neo4j-cypher/predicate.rb +5 -56
- data/lib/neo4j-cypher/property.rb +4 -12
- data/lib/neo4j-cypher/rel_var.rb +25 -31
- data/lib/neo4j-cypher/return.rb +0 -1
- data/lib/neo4j-cypher/root.rb +44 -22
- data/lib/neo4j-cypher/start.rb +36 -40
- data/lib/neo4j-cypher/version.rb +2 -2
- data/lib/neo4j-cypher/where.rb +16 -3
- data/lib/neo4j-cypher/with.rb +1 -3
- data/lib/tasks/analyzer.rake +54 -0
- metadata +13 -6
- data/lib/neo4j-cypher/mixins.rb +0 -47
data/lib/neo4j-cypher/start.rb
CHANGED
@@ -2,16 +2,19 @@ module Neo4j
|
|
2
2
|
module Cypher
|
3
3
|
class Start
|
4
4
|
include Clause
|
5
|
-
include Referenceable
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
def initialize(clause_list)
|
6
|
+
def initialize(clause_list, rvalue)
|
10
7
|
super(clause_list, :start, EvalContext)
|
8
|
+
@rvalue = rvalue
|
9
|
+
end
|
10
|
+
|
11
|
+
def entity_list(entity_type, entities)
|
12
|
+
list = entities.map { |n| n.respond_to?(:neo_id) ? n.neo_id : n }.join(',')
|
13
|
+
"#{entity_type}(#{list})"
|
11
14
|
end
|
12
15
|
|
13
|
-
def
|
14
|
-
|
16
|
+
def to_cypher
|
17
|
+
"#{var_name}=#{@rvalue}"
|
15
18
|
end
|
16
19
|
|
17
20
|
class EvalContext
|
@@ -30,63 +33,56 @@ module Neo4j
|
|
30
33
|
class StartNode < Start
|
31
34
|
|
32
35
|
def initialize(clause_list, nodes)
|
33
|
-
super(clause_list)
|
34
|
-
initialize_entities(nodes)
|
35
|
-
end
|
36
|
-
|
37
|
-
def to_cypher
|
38
|
-
"#{var_name}=node(#{entities.join(',')})"
|
36
|
+
super(clause_list, entity_list('node', nodes))
|
39
37
|
end
|
40
|
-
|
41
38
|
end
|
42
39
|
|
43
40
|
|
44
41
|
# Can be created from a <tt>rel</tt> dsl method.
|
45
42
|
class StartRel < Start
|
46
43
|
def initialize(clause_list, rels)
|
47
|
-
super(clause_list)
|
48
|
-
initialize_entities(rels)
|
44
|
+
super(clause_list, entity_list('relationship', rels))
|
49
45
|
end
|
46
|
+
end
|
50
47
|
|
51
|
-
|
52
|
-
|
48
|
+
class LuceneQuery < Start
|
49
|
+
def initialize(clause_list, query, type)
|
50
|
+
super(clause_list, "#{type}:#{query}")
|
51
|
+
end
|
52
|
+
|
53
|
+
def self._lookup_params(index_class, key, value)
|
54
|
+
%Q[#{_index_name_for_key(index_class, key)}(#{key}="#{value}")]
|
53
55
|
end
|
54
|
-
end
|
55
56
|
|
56
|
-
|
57
|
-
|
57
|
+
def self.lookup_node_by_class(clause_list, index_class, key, value)
|
58
|
+
LuceneQuery.new(clause_list, _lookup_params(index_class, key, value), 'node')
|
59
|
+
end
|
58
60
|
|
59
|
-
def
|
60
|
-
|
61
|
-
@index_name = index_class.index_name_for_type(index_type)
|
62
|
-
@query = query
|
61
|
+
def self.query_node_by_class(clause_list, index_class, query, index_type)
|
62
|
+
LuceneQuery.new(clause_list, "#{_index_name_for_type(index_class, index_type)}(#{query})", 'node')
|
63
63
|
end
|
64
64
|
|
65
|
-
def
|
66
|
-
|
65
|
+
def self.lookup_rel_by_class(clause_list, index_class, key, value)
|
66
|
+
LuceneQuery.new(clause_list, _lookup_params(index_class, key, value), 'relationship')
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.query_rel_by_class(clause_list, index_class, query, index_type)
|
70
|
+
LuceneQuery.new(clause_list, "#{_index_name_for_type(index_class, index_type)}(#{query})", 'relationship')
|
67
71
|
end
|
68
|
-
end
|
69
72
|
|
70
|
-
|
71
|
-
|
73
|
+
def self._index_name_for_type(index_class , index_type)
|
74
|
+
index_class.respond_to?(:index_name_for_type) ? index_class.index_name_for_type(index_type) : index_class.to_s
|
75
|
+
end
|
72
76
|
|
73
|
-
def
|
74
|
-
super(clause_list)
|
77
|
+
def self._index_name_for_key(index_class, key)
|
75
78
|
if index_class.respond_to?(:index_type)
|
76
79
|
index_type = index_class.index_type(key.to_s)
|
77
80
|
raise "No index on #{index_class} property #{key}" unless index_type
|
78
|
-
|
81
|
+
index_class.index_name_for_type(index_type)
|
79
82
|
else
|
80
|
-
|
83
|
+
index_class.to_s
|
81
84
|
end
|
82
|
-
|
83
|
-
@query = %Q[#{key}="#{value}"]
|
84
|
-
end
|
85
|
-
|
86
|
-
def to_cypher
|
87
|
-
%Q[#{var_name}=node:#{index_name}(#{query})]
|
88
85
|
end
|
89
|
-
|
90
86
|
end
|
91
87
|
|
92
88
|
end
|
data/lib/neo4j-cypher/version.rb
CHANGED
data/lib/neo4j-cypher/where.rb
CHANGED
@@ -3,13 +3,26 @@ module Neo4j
|
|
3
3
|
class Where
|
4
4
|
include Clause
|
5
5
|
|
6
|
-
def initialize(clause_list, where_statement = nil)
|
6
|
+
def initialize(clause_list, context, where_statement = nil, &block)
|
7
7
|
super(clause_list, :where)
|
8
|
-
|
8
|
+
|
9
|
+
if where_statement
|
10
|
+
@where_statement = where_statement
|
11
|
+
else
|
12
|
+
clause_list.push
|
13
|
+
RootClause::EvalContext.new(context).instance_exec(context, &block)
|
14
|
+
@where_statement = clause_list.to_cypher
|
15
|
+
clause_list.pop
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def neg!
|
21
|
+
@where_statement = "not(#{@where_statement})"
|
9
22
|
end
|
10
23
|
|
11
24
|
def to_cypher
|
12
|
-
@where_statement
|
25
|
+
@where_statement
|
13
26
|
end
|
14
27
|
end
|
15
28
|
end
|
data/lib/neo4j-cypher/with.rb
CHANGED
@@ -12,12 +12,10 @@ module Neo4j
|
|
12
12
|
|
13
13
|
@args = create_clause_args_for(args)
|
14
14
|
@arg_list = @args.map { |a| a.return_value }.join(',')
|
15
|
-
@where_or_match = where_or_match
|
16
15
|
arg_exec = @args.map(&:eval_context)
|
17
16
|
|
18
17
|
RootClause::EvalContext.new(self).instance_exec(*arg_exec, &cypher_dsl)
|
19
|
-
|
20
|
-
@body = "#{@where_or_match.to_s.upcase} #{clause_list.to_cypher}"
|
18
|
+
@body = "#{where_or_match.to_s.upcase} #{clause_list.to_cypher}"
|
21
19
|
clause_list.pop
|
22
20
|
end
|
23
21
|
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
#require 'term/ansicolor'
|
3
|
+
require 'reek/rake/task'
|
4
|
+
|
5
|
+
# Stolen rake task from https://github.com/andywenk/ruby_code_analyzer_rake_tasks/blob/master/lib/tasks/analyzer.rake
|
6
|
+
|
7
|
+
Reek::Rake::Task.new do |t|
|
8
|
+
t.source_files = "app"
|
9
|
+
t.verbose = false
|
10
|
+
t.fail_on_error = false
|
11
|
+
end
|
12
|
+
|
13
|
+
SOURCE_DIR = 'lib/neo4j-cypher/*.rb'
|
14
|
+
|
15
|
+
namespace :analyzer do
|
16
|
+
desc "run all code analyzing tools (reek, rails_best_practices, flog, flay)"
|
17
|
+
task :all => [:reek, :flog, :flay] do
|
18
|
+
message(:info, 'have been running all code analyzing tools')
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "run reek and find code smells"
|
22
|
+
task :reek do
|
23
|
+
message(:info, 'Running reek and find code smells')
|
24
|
+
Rake::Task['reek'].invoke
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "run flog and find the most tortured code"
|
28
|
+
task :flog do
|
29
|
+
message(:info, 'Running flog and find the most tortured code')
|
30
|
+
sh "flog -ca #{SOURCE_DIR}"
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "run flay and analyze code for structural similarities"
|
34
|
+
task :flay do
|
35
|
+
message(:info, 'Running flay and and analyze code for structural similarities')
|
36
|
+
sh "flay #{SOURCE_DIR}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def message(type, message)
|
41
|
+
set_color(type)
|
42
|
+
puts message
|
43
|
+
reset_color
|
44
|
+
end
|
45
|
+
|
46
|
+
def set_color(type)
|
47
|
+
term = Term::ANSIColor
|
48
|
+
colors = {info: term.green, error: term.red}
|
49
|
+
puts colors[type]
|
50
|
+
end
|
51
|
+
|
52
|
+
def reset_color
|
53
|
+
puts Term::ANSIColor.reset
|
54
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j-cypher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andreas Ronge
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-02 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'This gem is used in the JRuby neo4j gem but should work on any Ruby
|
15
15
|
implementation since it simply
|
@@ -23,13 +23,16 @@ extensions: []
|
|
23
23
|
extra_rdoc_files:
|
24
24
|
- README.rdoc
|
25
25
|
files:
|
26
|
+
- lib/neo4j-cypher/abstract_filter.rb
|
26
27
|
- lib/neo4j-cypher/argument.rb
|
27
28
|
- lib/neo4j-cypher/clause.rb
|
28
29
|
- lib/neo4j-cypher/clause_list.rb
|
30
|
+
- lib/neo4j-cypher/collection.rb
|
29
31
|
- lib/neo4j-cypher/context.rb
|
30
32
|
- lib/neo4j-cypher/create.rb
|
33
|
+
- lib/neo4j-cypher/foreach.rb
|
31
34
|
- lib/neo4j-cypher/match.rb
|
32
|
-
- lib/neo4j-cypher/
|
35
|
+
- lib/neo4j-cypher/neography.rb
|
33
36
|
- lib/neo4j-cypher/node_var.rb
|
34
37
|
- lib/neo4j-cypher/operator.rb
|
35
38
|
- lib/neo4j-cypher/predicate.rb
|
@@ -44,6 +47,7 @@ files:
|
|
44
47
|
- lib/neo4j-cypher/where.rb
|
45
48
|
- lib/neo4j-cypher/with.rb
|
46
49
|
- lib/neo4j-cypher.rb
|
50
|
+
- lib/tasks/analyzer.rake
|
47
51
|
- README.rdoc
|
48
52
|
- Gemfile
|
49
53
|
- neo4j-cypher.gemspec
|
@@ -69,9 +73,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
69
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
74
|
none: false
|
71
75
|
requirements:
|
72
|
-
- - ! '
|
76
|
+
- - ! '>='
|
73
77
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
78
|
+
version: '0'
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
hash: -2728689632116511744
|
75
82
|
requirements: []
|
76
83
|
rubyforge_project: neo4j-cypher
|
77
84
|
rubygems_version: 1.8.24
|
data/lib/neo4j-cypher/mixins.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Cypher
|
3
|
-
module Referenceable
|
4
|
-
def var_name
|
5
|
-
@var_name ||= @clause_list.create_variable(self)
|
6
|
-
end
|
7
|
-
|
8
|
-
def var_name=(new_name)
|
9
|
-
@var_name = new_name.to_sym
|
10
|
-
end
|
11
|
-
|
12
|
-
def referenced?
|
13
|
-
!!@referenced
|
14
|
-
end
|
15
|
-
|
16
|
-
def referenced!
|
17
|
-
@referenced = true
|
18
|
-
end
|
19
|
-
|
20
|
-
def as_alias(new_name)
|
21
|
-
@alias = new_name
|
22
|
-
self.var_name = new_name
|
23
|
-
end
|
24
|
-
|
25
|
-
def alias_name
|
26
|
-
@alias
|
27
|
-
end
|
28
|
-
|
29
|
-
def as_alias?
|
30
|
-
!!@alias && var_name != return_value
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
module ToPropString
|
36
|
-
def to_prop_string(props)
|
37
|
-
key_values = props.keys.map do |key|
|
38
|
-
raw = key.to_s[0, 1] == '_'
|
39
|
-
val = props[key].is_a?(String) && !raw ? "'#{props[key]}'" : props[key]
|
40
|
-
"#{raw ? key.to_s[1..-1] : key} : #{val}"
|
41
|
-
end
|
42
|
-
"{#{key_values.join(', ')}}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|