active-orient 0.4 → 0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +8 -3
- data/Guardfile +12 -4
- data/README.md +221 -201
- data/VERSION +1 -1
- data/active-orient.gemspec +3 -2
- data/bin/active-orient-console +35 -0
- data/config/boot.rb +84 -16
- data/config/config.yml +10 -0
- data/config/connect.yml +6 -2
- data/create_project +19 -0
- data/examples/books.rb +86 -39
- data/examples/createTime.rb +91 -0
- data/examples/streets.rb +85 -84
- data/examples/test_commands.rb +92 -0
- data/examples/test_commands_2.rb +54 -0
- data/examples/test_commands_3.rb +48 -0
- data/examples/test_commands_4.rb +28 -0
- data/examples/time_graph/Gemfile +21 -0
- data/examples/time_graph/Guardfile +26 -0
- data/examples/time_graph/README.md +129 -0
- data/examples/time_graph/bin/active-orient-console +35 -0
- data/examples/time_graph/config/boot.rb +119 -0
- data/examples/time_graph/config/config.yml +8 -0
- data/examples/time_graph/config/connect.yml +17 -0
- data/examples/time_graph/config/init_db.rb +59 -0
- data/examples/time_graph/createTime.rb +51 -0
- data/examples/time_graph/lib/createTime.rb +82 -0
- data/examples/time_graph/model/day_of.rb +3 -0
- data/examples/time_graph/model/e.rb +6 -0
- data/examples/time_graph/model/edge.rb +53 -0
- data/examples/time_graph/model/monat.rb +19 -0
- data/examples/time_graph/model/stunde.rb +16 -0
- data/examples/time_graph/model/tag.rb +29 -0
- data/examples/time_graph/model/time_base.rb +6 -0
- data/examples/time_graph/model/time_of.rb +4 -0
- data/examples/time_graph/model/v.rb +3 -0
- data/examples/time_graph/model/vertex.rb +32 -0
- data/examples/time_graph/spec/lib/create_time_spec.rb +50 -0
- data/examples/time_graph/spec/rest_helper.rb +37 -0
- data/examples/time_graph/spec/spec_helper.rb +46 -0
- data/lib/active-orient.rb +56 -6
- data/lib/base.rb +149 -147
- data/lib/base_properties.rb +40 -41
- data/lib/class_utils.rb +301 -0
- data/lib/database_utils.rb +97 -0
- data/lib/init.rb +35 -0
- data/lib/java-api.rb +437 -0
- data/lib/jdbc.rb +211 -0
- data/lib/model/edge.rb +53 -0
- data/lib/model/model.rb +77 -0
- data/lib/model/the_class.rb +480 -0
- data/lib/model/the_record.rb +310 -0
- data/lib/model/vertex.rb +32 -0
- data/lib/orient.rb +113 -50
- data/lib/orientdb_private.rb +48 -0
- data/lib/other.rb +280 -0
- data/lib/query.rb +71 -73
- data/lib/rest/change.rb +124 -0
- data/lib/rest/create.rb +474 -0
- data/lib/rest/delete.rb +133 -0
- data/lib/rest/operations.rb +150 -0
- data/lib/rest/read.rb +150 -0
- data/lib/rest/rest.rb +111 -0
- data/lib/rest_disabled.rb +24 -0
- data/lib/support.rb +387 -296
- data/old_lib_functions/two_general_class.rb +139 -0
- data/usecase.md +49 -36
- data/usecase_oo.md +59 -0
- metadata +73 -9
- data/lib/model.rb +0 -461
- data/lib/rest.rb +0 -1036
- data/test.rb +0 -4
@@ -0,0 +1,24 @@
|
|
1
|
+
=begin #nodoc#
|
2
|
+
If properties are allocated on class-level, they can be preinitialized using
|
3
|
+
this method.
|
4
|
+
This is disabled for now, because it does not seem nessesary
|
5
|
+
=end
|
6
|
+
|
7
|
+
def preallocate_class_properties o_class
|
8
|
+
p= get_class_properties( o_class )['properties']
|
9
|
+
unless p.nil? || p.blank?
|
10
|
+
predefined_attributes = p.map do | property |
|
11
|
+
[ property['name'] ,
|
12
|
+
case property['type']
|
13
|
+
when 'LINKMAP'
|
14
|
+
Array.new
|
15
|
+
when 'STRING'
|
16
|
+
''
|
17
|
+
else
|
18
|
+
nil
|
19
|
+
end ]
|
20
|
+
end.to_h
|
21
|
+
else
|
22
|
+
{}
|
23
|
+
end
|
24
|
+
end
|
data/lib/support.rb
CHANGED
@@ -1,347 +1,438 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
self[1..-1]
|
5
|
-
else
|
6
|
-
self.camelize
|
7
|
-
end
|
8
|
-
end
|
9
|
-
def to_orient
|
10
|
-
self.gsub /%/, '(percent)'
|
1
|
+
require 'active_support/inflector'
|
2
|
+
module OrientSupport
|
3
|
+
module Support
|
11
4
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
5
|
+
=begin
|
6
|
+
supports
|
7
|
+
where: 'string'
|
8
|
+
where: { property: 'value', property: value, ... }
|
9
|
+
where: ['string, { property: value, ... }, ... ]
|
10
|
+
Used by update and select
|
11
|
+
=end
|
12
|
+
|
13
|
+
## ORD.compose_where 'z=34', {u:6}
|
14
|
+
# => "where z=34 and u = 6"
|
15
|
+
#
|
16
|
+
def compose_where *arg
|
17
|
+
arg = arg.flatten
|
18
|
+
return "" if arg.blank? || arg.size == 1 && arg.first.blank?
|
19
|
+
"where " + arg.map do |issue|
|
20
|
+
case issue
|
21
|
+
when String
|
22
|
+
issue
|
23
|
+
else
|
24
|
+
generate_sql_list issue
|
25
|
+
end
|
26
|
+
end.join(' and ')
|
22
27
|
end
|
23
|
-
## this enables the universal use of an rid-string as pseudonym for a ActiveOrient::Model
|
24
|
-
alias :reload! from_orient
|
25
|
-
end
|
26
|
-
class NilClass
|
27
|
-
def to_orient
|
28
|
-
self
|
29
|
-
end
|
30
|
-
end
|
31
|
-
class Symbol
|
32
|
-
def to_orient
|
33
|
-
self.to_s.to_orient
|
34
|
-
end
|
35
|
-
def from_orient
|
36
|
-
self
|
37
|
-
end
|
38
|
-
end
|
39
28
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
29
|
+
=begin
|
30
|
+
designs a list of "Key = Value" pairs combined by "and" or the fillword provided by the block
|
31
|
+
ORD.generate_sql_list where: 25 , upper: '65'
|
32
|
+
=> "where = 25 and upper = '65'"
|
33
|
+
ORD.generate_sql_list( con_id: 25 , symbol: :G) { ',' }
|
34
|
+
=> "con_id = 25 , symbol = 'G'"
|
35
|
+
=end
|
36
|
+
def generate_sql_list attributes = {}
|
37
|
+
fill = block_given? ? yield : 'and'
|
38
|
+
attributes.map do |key, value|
|
39
|
+
case value
|
40
|
+
when ActiveOrient::Model
|
41
|
+
"#{key} = #{value.rrid}"
|
42
|
+
when Numeric
|
43
|
+
"#{key} = #{value}"
|
44
|
+
when Array
|
45
|
+
"#{key}= #{value.to_orient}"
|
46
|
+
when Date
|
47
|
+
"#{key} = date(\'#{value.to_s}\',\'yyyy-MM-dd\')"
|
48
|
+
else # String, Symbol, Time, Trueclass, Falseclass ...
|
49
|
+
"#{key} = \'#{value.to_s}\'"
|
50
|
+
end
|
51
|
+
end.join(" #{fill} ")
|
52
|
+
end
|
46
53
|
end
|
47
|
-
end
|
48
54
|
|
49
|
-
class Time
|
50
|
-
def from_orient
|
51
|
-
self
|
52
|
-
end
|
53
|
-
def to_orient
|
54
|
-
self
|
55
|
-
end
|
56
|
-
end
|
57
|
-
class Date
|
58
|
-
def from_orient
|
59
|
-
self
|
60
|
-
end
|
61
|
-
def to_orient
|
62
|
-
self
|
63
|
-
end
|
64
|
-
end
|
65
55
|
|
66
|
-
class
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
class FalseClass
|
75
|
-
def from_orient
|
76
|
-
self
|
77
|
-
end
|
78
|
-
def to_orient
|
79
|
-
self
|
80
|
-
end
|
81
|
-
end
|
56
|
+
class MatchConnection
|
57
|
+
attr_accessor :as
|
58
|
+
def initialize edge: nil, direction: :both, as: nil, count: 1
|
59
|
+
@edge = edge
|
60
|
+
@direction = direction # may be :both, :in, :out
|
61
|
+
@as = as
|
62
|
+
@count = count
|
63
|
+
end
|
82
64
|
|
83
|
-
|
84
|
-
|
85
|
-
map &:to_orient
|
65
|
+
def direction= dir
|
66
|
+
@direction = dir
|
86
67
|
end
|
87
|
-
|
88
|
-
|
68
|
+
|
69
|
+
|
70
|
+
def direction
|
71
|
+
fillup = @edge.present? ? @edge : ''
|
72
|
+
case @direction
|
73
|
+
when :both
|
74
|
+
" -#{fillup}- "
|
75
|
+
when :in
|
76
|
+
" <-#{fillup}- "
|
77
|
+
when :out
|
78
|
+
" -#{fillup}-> "
|
79
|
+
end
|
80
|
+
|
89
81
|
end
|
90
|
-
end
|
91
|
-
class Hash #WithIndifferentAccess
|
92
|
-
def from_orient
|
93
|
-
substitute_hash = HashWithIndifferentAccess.new
|
94
|
-
keys.each{ |k| puts self[k].inspect }
|
95
|
-
keys.each{| k | substitute_hash[k] = self[k].from_orient }
|
96
|
-
substitute_hash
|
97
82
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
keys.each{| k | substitute_hash[k] = self[k].to_orient }
|
102
|
-
substitute_hash
|
83
|
+
def compose
|
84
|
+
ministatement = @as.present? ? "{ as: #{@as} } " : ""
|
85
|
+
(1 .. @count).map{|x| direction }.join("{}") << ministatement
|
103
86
|
|
87
|
+
end
|
88
|
+
|
104
89
|
end
|
105
90
|
|
106
|
-
|
107
|
-
|
91
|
+
class MatchStatement
|
92
|
+
include Support
|
93
|
+
attr_accessor :as
|
94
|
+
attr_accessor :where
|
95
|
+
def initialize match_class=nil, **args
|
96
|
+
@misc = []
|
97
|
+
@where = []
|
98
|
+
@while = []
|
99
|
+
@maxdepth = 0
|
100
|
+
@as = nil
|
101
|
+
|
102
|
+
|
103
|
+
@match_class = match_class
|
104
|
+
@as = match_class.pluralize if match_class.is_a? String
|
105
|
+
|
106
|
+
args.each do |k, v|
|
107
|
+
case k
|
108
|
+
when :as
|
109
|
+
@as = v
|
110
|
+
when :while
|
111
|
+
@while << v
|
112
|
+
when :where
|
113
|
+
@where << v
|
114
|
+
when :class
|
115
|
+
@match_class = v
|
116
|
+
@as = v.pluralize
|
117
|
+
else
|
118
|
+
self.send k, v
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def while_s
|
124
|
+
compose_where( @while ).gsub( /where/, 'while:(' )<< ")" unless @while.blank?
|
125
|
+
end
|
126
|
+
|
127
|
+
def match_alias
|
128
|
+
"as: #{@as }"
|
129
|
+
end
|
130
|
+
def where_s
|
131
|
+
compose_where( @where ).gsub( /where/, 'where:(' )<< ")" unless @where.blank?
|
132
|
+
end
|
133
|
+
|
134
|
+
def maxdepth=x
|
135
|
+
@maxdepth = x
|
108
136
|
end
|
109
|
-
end
|
110
137
|
|
138
|
+
def method_missing method, *arg, &b
|
139
|
+
@misc << method.to_s << " " << arg.map(&:to_s).join(' ')
|
140
|
+
end
|
111
141
|
|
112
|
-
|
142
|
+
def misc
|
143
|
+
@misc.join(' ') unless @misc.empty?
|
144
|
+
end
|
145
|
+
# used for the first compose-statement of a compose-query
|
146
|
+
def compose_simple
|
147
|
+
'{'+ [ "class: #{@match_class}",
|
148
|
+
"as: #{@as}" ,
|
149
|
+
where_s ].compact.join(', ') + '}'
|
150
|
+
end
|
113
151
|
|
114
|
-
|
115
|
-
|
116
|
-
|
152
|
+
def compose
|
153
|
+
|
154
|
+
'{'+ [ "class: #{@match_class}",
|
155
|
+
"as: #{@as}" ,
|
156
|
+
where_s,
|
157
|
+
while_s,
|
158
|
+
@maxdepth >0 ? "maxdepth: #{maxdepth}": nil ].compact.join(', ')+'}'
|
159
|
+
end
|
160
|
+
alias :to_s :compose
|
161
|
+
end
|
117
162
|
|
118
|
-
|
119
|
-
|
120
|
-
where: ['string, { property: value, ... }, ... ]
|
163
|
+
class OrientQuery
|
164
|
+
include Support
|
121
165
|
|
166
|
+
=begin
|
167
|
+
Call where without a parameter to request the saved where-string
|
168
|
+
To create the where-part of the query a string, a hash or an Array is supported
|
122
169
|
|
123
|
-
|
170
|
+
where: "r > 9" --> where r > 9
|
171
|
+
where: {a: 9, b: 's'} --> where a = 9 and b = 's'
|
172
|
+
where:[{ a: 2} , 'b > 3',{ c: 'ufz' }] --> where a = 2 and b > 3 and c = 'ufz'
|
124
173
|
=end
|
125
174
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
175
|
+
attr_accessor :where
|
176
|
+
attr_accessor :let
|
177
|
+
attr_accessor :projection
|
178
|
+
attr_accessor :order
|
179
|
+
attr_accessor :match_statements
|
180
|
+
|
181
|
+
def initialize **args
|
182
|
+
@projection = []
|
183
|
+
@misc = []
|
184
|
+
@let = []
|
185
|
+
@where = []
|
186
|
+
@order = []
|
187
|
+
@aliases = []
|
188
|
+
@match_statements = []
|
189
|
+
@class = nil
|
190
|
+
@kind = 'select'
|
191
|
+
args.each do |k, v|
|
192
|
+
case k
|
193
|
+
when :projection
|
194
|
+
@projection << v
|
195
|
+
when :let
|
196
|
+
@let << v
|
197
|
+
when :order
|
198
|
+
@order << v
|
199
|
+
when :where
|
200
|
+
@where << v
|
201
|
+
when :kind
|
202
|
+
@kind = v
|
203
|
+
when :start
|
204
|
+
@match_statements[0] = MatchStatement.new **v
|
205
|
+
# @match_statements[1] = MatchConnection.new
|
206
|
+
when :connection
|
207
|
+
@match_statements[1] = MatchConnection.new **v
|
208
|
+
when :return
|
209
|
+
@aliases << v
|
210
|
+
else
|
211
|
+
self.send k, v
|
212
|
+
end
|
135
213
|
end
|
136
|
-
end.join( ' and ' )
|
137
|
-
end
|
138
|
-
def generate_sql_list attributes={}
|
139
|
-
attributes.map do | key, value |
|
140
|
-
case value
|
141
|
-
when Numeric
|
142
|
-
key.to_s << " = " << value.to_s
|
143
|
-
else # String, Symbol, Date, Time, Trueclass, Falseclass ...
|
144
|
-
key.to_s << ' = ' << "\'#{ value }\'"
|
145
|
-
end
|
146
|
-
end.join( ' and ' )
|
147
214
|
end
|
148
|
-
end # module
|
149
215
|
|
216
|
+
def method_missing method, *arg, &b
|
217
|
+
@misc << method.to_s << " " << arg.map(&:to_s).join(' ')
|
218
|
+
end
|
219
|
+
|
220
|
+
def misc
|
221
|
+
@misc.join(' ') unless @misc.empty?
|
222
|
+
end
|
150
223
|
|
151
|
-
|
224
|
+
def subquery
|
225
|
+
nil
|
226
|
+
end
|
152
227
|
|
153
|
-
include Support
|
154
228
|
|
155
|
-
def initialize **args
|
156
|
-
@projection = []
|
157
|
-
@misc = []
|
158
|
-
@let = []
|
159
|
-
@where = []
|
160
|
-
@order = []
|
161
|
-
args.each do | k,v|
|
162
|
-
case k
|
163
|
-
when :projection
|
164
|
-
@projection << v
|
165
|
-
when :let
|
166
|
-
@let << v
|
167
|
-
when :order
|
168
|
-
@order << v
|
169
|
-
when :where
|
170
|
-
@where << v
|
171
|
-
else
|
172
|
-
self.send k, v
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
229
|
|
177
|
-
|
178
|
-
|
179
|
-
end
|
230
|
+
=begin
|
231
|
+
(only if kind == :match): connect
|
180
232
|
|
181
|
-
|
182
|
-
@misc.join(' ') unless @misc.empty?
|
183
|
-
end
|
233
|
+
Add a connection to the match-query
|
184
234
|
|
185
|
-
|
186
|
-
|
187
|
-
end
|
235
|
+
A Match-Query alwas has an Entry-Stratement and maybe other Statements.
|
236
|
+
They are connected via " -> " (outE), "<-" (inE) or "--" (both).
|
188
237
|
|
189
|
-
|
190
|
-
[ "select", projection_s, from, let_s, where_s , subquery, misc, order_s , group_by, unwind, skip ].compact.join(' ')
|
191
|
-
end
|
238
|
+
The connection method adds a connection to the statement-stack.
|
192
239
|
|
193
|
-
|
194
|
-
|
195
|
-
|
240
|
+
Parameters:
|
241
|
+
direction: :in, :out, :both
|
242
|
+
edge_class: to restrict the Query on a certain Edge-Class
|
243
|
+
count: To repeat the connection
|
244
|
+
as: Includes a micro-statement to finalize the Match-Query
|
245
|
+
as: defines a output-variablet, which is used later in the return-statement
|
246
|
+
|
247
|
+
The method returns the OrientSupport::MatchConnection object, which can be modified further.
|
248
|
+
It is compiled by calling compose
|
196
249
|
=end
|
197
|
-
def from arg=nil
|
198
|
-
if arg.present?
|
199
|
-
@database = case arg
|
200
|
-
when Class
|
201
|
-
arg.new.classname
|
202
|
-
when ActiveOrient::Model
|
203
|
-
classname
|
204
|
-
when String
|
205
|
-
arg
|
206
|
-
when Symbol
|
207
|
-
arg
|
208
|
-
when OrientQuery
|
209
|
-
arg
|
210
|
-
end
|
211
|
-
compose # return the complete query
|
212
|
-
else # read from
|
213
|
-
"from " << @database.to_s unless @database.nil?
|
214
|
-
end
|
215
|
-
end
|
216
|
-
alias :from= :from
|
217
|
-
def database_class= arg
|
218
|
-
@database = arg if @database.present?
|
219
|
-
if @from.is_a? OrientQuery
|
220
|
-
@from.database_class= arg
|
221
|
-
end
|
222
|
-
end
|
223
|
-
def database_class
|
224
|
-
if @database.present?
|
225
|
-
@database
|
226
|
-
elsif @from.is_a? OrientQuery
|
227
|
-
@from.database_class
|
228
|
-
else
|
229
|
-
nil
|
230
|
-
end
|
231
|
-
end
|
232
250
|
|
251
|
+
def connect direction, edge_class: nil, count: 1, as: nil
|
252
|
+
direction= :both unless [ :in, :out].include? direction
|
253
|
+
match_statements << m = OrientSupport::MatchConnection.new( direction: direction, count: count, as: as)
|
254
|
+
m
|
255
|
+
end
|
233
256
|
|
234
257
|
=begin
|
235
|
-
|
258
|
+
(only if kind == :match): statement
|
236
259
|
|
237
|
-
|
260
|
+
A Match Query consists of a simple start-statement
|
261
|
+
( classname and where-condition ), a connection followd by other Statement-connection-pairs.
|
262
|
+
It performs a sub-query starting at the given entry-point.
|
238
263
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
=end
|
243
|
-
attr_accessor :where
|
244
|
-
def where_s
|
245
|
-
compose_where @where
|
246
|
-
end
|
264
|
+
Statement adds a statement to the statement-stack.
|
265
|
+
Statement returns the created OrientSupport::MatchStatement-record for further modifications.
|
266
|
+
It is compiled by calling »compose«.
|
247
267
|
|
268
|
+
OrientSupport::OrientQuery collects any "as"-directive for inclusion in the return-statement
|
248
269
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
270
|
+
Parameter (all optional)
|
271
|
+
Class: classname, :where: {}, while: {}, as: string, maxdepth: >0 ,
|
272
|
+
|
273
|
+
=end
|
274
|
+
def statement match_class= nil, **args
|
275
|
+
match_statements << s = OrientSupport::MatchStatement.new( mattch_class, args )
|
276
|
+
s
|
277
|
+
end
|
278
|
+
=begin
|
279
|
+
Output the compiled query
|
280
|
+
Parameter: destination (rest, batch )
|
281
|
+
If the query is submitted via the REST-Interface (as get-command), the limit parameter is extracted.
|
282
|
+
=end
|
283
|
+
|
284
|
+
def compose(destination: :batch)
|
285
|
+
if @kind == :match
|
286
|
+
unless @match_statements.empty?
|
287
|
+
match_query = @kind.to_s.upcase + " "+ @match_statements[0].compose_simple
|
288
|
+
match_query << @match_statements[1..-1].map( &:compose ).join
|
289
|
+
match_query << " RETURN "<< (@match_statements.map( &:as ).compact | @aliases).join(', ')
|
262
290
|
end
|
291
|
+
elsif destination == :rest
|
292
|
+
[@kind, projection_s, from, let_s, where_s, subquery, misc, order_s, group_by, unwind, skip].compact.join(' ')
|
293
|
+
else
|
294
|
+
[@kind, projection_s, from, let_s, where_s, subquery, misc, order_s, group_by, limit, unwind, skip].compact.join(' ')
|
263
295
|
end
|
296
|
+
end
|
297
|
+
alias :to_s :compose
|
264
298
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
"distinct( #{d.to_s} )"
|
269
|
-
when Array
|
270
|
-
"distinct( #{d.first} ) as #{d.last}"
|
271
|
-
when Hash
|
272
|
-
"distinct( #{d.first.first} ) as #{d.first.last}"
|
273
|
-
else
|
274
|
-
""
|
275
|
-
end
|
276
|
-
compose # return the hole query
|
277
|
-
end
|
278
|
-
alias :distinct= :distinct
|
279
|
-
|
280
|
-
attr_accessor :projection
|
281
|
-
def projection_s
|
282
|
-
|
283
|
-
@projection.map do | s |
|
284
|
-
case s
|
285
|
-
when Hash
|
286
|
-
s.map{ |x,y| "#{x} as #{y}"}.join( ', ')
|
287
|
-
when Array
|
288
|
-
s.join(', ')
|
289
|
-
else
|
290
|
-
s
|
291
|
-
end
|
292
|
-
end.join( ', ' )
|
299
|
+
=begin
|
300
|
+
from can either be a Databaseclass to operate on or a Subquery providing data to query further
|
301
|
+
=end
|
293
302
|
|
303
|
+
|
304
|
+
def from arg = nil
|
305
|
+
if arg.present?
|
306
|
+
@database = case arg
|
307
|
+
when ActiveOrient::Model
|
308
|
+
arg.rrid
|
309
|
+
when OrientQuery
|
310
|
+
' ( '+ arg.to_s + ' ) '
|
311
|
+
else
|
312
|
+
if arg.to_s.rid?
|
313
|
+
arg
|
314
|
+
else
|
315
|
+
ORD.classname(arg)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
compose # return the complete query
|
319
|
+
else # read from
|
320
|
+
"from #{@database}" unless @database.nil?
|
294
321
|
end
|
322
|
+
end
|
323
|
+
alias :from= :from
|
324
|
+
|
325
|
+
def database_class
|
326
|
+
if @database.present?
|
327
|
+
@database
|
328
|
+
elsif @from.is_a? OrientQuery
|
329
|
+
@from.database_class
|
330
|
+
else
|
331
|
+
nil
|
332
|
+
end
|
333
|
+
end
|
295
334
|
|
335
|
+
def database_class= arg
|
336
|
+
@database = arg if @database.present?
|
337
|
+
if @from.is_a? OrientQuery
|
338
|
+
@from.database_class= arg
|
339
|
+
end
|
340
|
+
end
|
296
341
|
|
297
|
-
|
342
|
+
def where_s
|
343
|
+
compose_where @where
|
344
|
+
end
|
298
345
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
346
|
+
def let_s
|
347
|
+
unless @let.empty?
|
348
|
+
"let " << @let.map do |s|
|
349
|
+
case s
|
350
|
+
when String
|
351
|
+
s
|
352
|
+
when Array
|
353
|
+
s.join(', ')
|
354
|
+
# when Hash ### is not recognized in jruby
|
355
|
+
else
|
356
|
+
s.map{|x,y| "$#{x} = (#{y})"}.join(', ')
|
357
|
+
end
|
358
|
+
end.join(', ')
|
359
|
+
end
|
360
|
+
end
|
312
361
|
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
362
|
+
def distinct d
|
363
|
+
@projection << case d
|
364
|
+
when String, Symbol
|
365
|
+
"distinct( #{d.to_s} )"
|
366
|
+
when Array
|
367
|
+
"distinct( #{d.first} ) as #{d.last}"
|
368
|
+
when Hash
|
369
|
+
"distinct( #{d.first.first} ) as #{d.first.last}"
|
370
|
+
else
|
371
|
+
""
|
372
|
+
end
|
373
|
+
compose # return the hole query
|
374
|
+
end
|
375
|
+
alias :distinct= :distinct
|
376
|
+
|
377
|
+
def projection_s
|
378
|
+
@projection.map do | s |
|
379
|
+
case s
|
380
|
+
when Array
|
381
|
+
s.join(', ')
|
382
|
+
when String, Symbol
|
383
|
+
s.to_s
|
384
|
+
else
|
385
|
+
s.map{ |x,y| "#{x} as #{y}"}.join( ', ')
|
386
|
+
end
|
387
|
+
end.join( ', ' )
|
388
|
+
end
|
317
389
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
#
|
338
|
-
#
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
#
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
390
|
+
def limit l=nil
|
391
|
+
@limit = "limit #{l.to_s}" if l.present?
|
392
|
+
# only a string is allowed
|
393
|
+
@limit # return_value
|
394
|
+
end
|
395
|
+
alias :limit= :limit
|
396
|
+
|
397
|
+
def get_limit
|
398
|
+
@limit.nil? ? -1 : @limit.split(' ').last.to_i
|
399
|
+
end
|
400
|
+
|
401
|
+
def group_by g = nil
|
402
|
+
@group = "group by #{g.to_s}" if g.present?
|
403
|
+
# only a string is allowed
|
404
|
+
@group # return_value
|
405
|
+
end
|
406
|
+
|
407
|
+
def unwind u = nil
|
408
|
+
@unwind = "unwind #{u.to_s}" if u.present?
|
409
|
+
# only a string is allowed
|
410
|
+
@unwind # return_value
|
411
|
+
end
|
412
|
+
|
413
|
+
def skip n = nil
|
414
|
+
@skip = n if n.present?
|
415
|
+
"skip #{@skip}" if @skip.present?
|
416
|
+
end
|
417
|
+
|
418
|
+
def order_s
|
419
|
+
unless @order.empty?
|
420
|
+
# the [@order] is nessesary to enable query.order= "..." oder query.order= { a: :b }
|
421
|
+
"order by " << [@order].flatten.map do |o|
|
422
|
+
#puts "CLASS : "+o.class.to_s
|
423
|
+
#puts o.to_s
|
424
|
+
case o
|
425
|
+
when String, Symbol, Array
|
426
|
+
o.to_s
|
427
|
+
else
|
428
|
+
o.map{|x,y| "#{x} #{y}"}.join(" ")
|
429
|
+
end # case
|
430
|
+
end.join(', ')
|
431
|
+
else
|
432
|
+
''
|
433
|
+
end # unless
|
434
|
+
end # def
|
435
|
+
end # class
|
436
|
+
|
437
|
+
|
438
|
+
end # module
|