smql 0.0.4.3 → 0.0.4.4
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.
- data/VERSION +1 -1
- data/lib/smql_to_ar.rb +38 -6
- data/lib/smql_to_ar/condition_types.rb +2 -2
- data/lib/smql_to_ar/query_builder.rb +23 -12
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.4.
|
1
|
+
0.0.4.4
|
data/lib/smql_to_ar.rb
CHANGED
@@ -107,9 +107,8 @@ class SmqlToAR
|
|
107
107
|
|
108
108
|
# Model der Relation `rel` von `model`
|
109
109
|
def self.model_of model, rel
|
110
|
-
|
111
|
-
r
|
112
|
-
r.nil? && :self == rel ? model : r
|
110
|
+
r = model.reflections[ rel.to_sym].andand.klass
|
111
|
+
r.nil? && rel === :self ? model : r
|
113
112
|
end
|
114
113
|
|
115
114
|
# Eine Spalte in einer Tabelle, relativ zu `Column#model`.
|
@@ -120,10 +119,43 @@ class SmqlToAR
|
|
120
119
|
attr_reader :path, :col
|
121
120
|
attr_accessor :model
|
122
121
|
|
122
|
+
class Col
|
123
|
+
attr_accessor :col, :as
|
124
|
+
def initialize col, as = nil
|
125
|
+
if col.kind_of? Col
|
126
|
+
@col, @as = col.col, col.as
|
127
|
+
elsif /^(.*?)\[(.*)\]$/ =~ col.to_s
|
128
|
+
@col, @as = $1, $2
|
129
|
+
else
|
130
|
+
@col, @as = col.to_s, as.to_s
|
131
|
+
@as = nil if @as.blank?
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def to_s() @col end
|
136
|
+
def to_sym() to_s.to_sym end
|
137
|
+
def inspect() "#{@col}[@#{@as}]" end
|
138
|
+
def to_alias() "#{@col}[#{@as}]" end
|
139
|
+
|
140
|
+
def == other
|
141
|
+
other = Col.new other
|
142
|
+
@col = other.col && @as == other.col
|
143
|
+
end
|
144
|
+
|
145
|
+
def === other
|
146
|
+
other = Col.new other
|
147
|
+
@col == other.col
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
123
151
|
def initialize model, *col
|
124
152
|
@model = model
|
125
153
|
@last_model = nil
|
126
|
-
*@path, @col = *Array.wrap( col).
|
154
|
+
*@path, @col = *Array.wrap( col).
|
155
|
+
collect( &it.to_s.split( /[.\/]/)).
|
156
|
+
flatten.
|
157
|
+
collect( &Col.method( :new)).
|
158
|
+
reject( &it===:self)
|
127
159
|
end
|
128
160
|
|
129
161
|
def last_model
|
@@ -133,8 +165,7 @@ class SmqlToAR
|
|
133
165
|
def each
|
134
166
|
model = @model
|
135
167
|
@path.each do |rel|
|
136
|
-
rel
|
137
|
-
unless :self == rel
|
168
|
+
unless rel === :self
|
138
169
|
model = SmqlToAR.model_of model, rel
|
139
170
|
return false unless model
|
140
171
|
yield rel, model
|
@@ -169,6 +200,7 @@ class SmqlToAR
|
|
169
200
|
exe.call pp, model
|
170
201
|
end
|
171
202
|
end
|
203
|
+
|
172
204
|
def self?() !@col end
|
173
205
|
def length() @path.length+(self.self? ? 0 : 1) end
|
174
206
|
def size() @path.size+(self.self? ? 0 : 1) end
|
@@ -56,7 +56,7 @@ class SmqlToAR
|
|
56
56
|
r = nil
|
57
57
|
#p :try_parse => { :model => model, :colop => colop, :value => val }
|
58
58
|
conditions.each do |c|
|
59
|
-
raise_unless colop =~ /^(?:\d*:)?(.*?)(
|
59
|
+
raise_unless colop =~ /^(?:\d*:)?(.*?)((?:\W*(?!\])\W)?)$/, UnexpectedColOpError.new( model, colop, val)
|
60
60
|
col, op = $1, $2
|
61
61
|
col = split_keys( col).collect {|c| Column.new model, c }
|
62
62
|
r = c.try_parse model, col, op, val
|
@@ -248,7 +248,7 @@ class SmqlToAR
|
|
248
248
|
col.joins.each {|j, m| builder.joins table+j, m }
|
249
249
|
builder.joins t, model
|
250
250
|
b2 = 1 == sub.length ? builder : Or.new( builder)
|
251
|
-
sub.each {|i| i.collect( &it.build( And.new( b2), t))
|
251
|
+
sub.each {|i| i.collect( &it.build( And.new( b2), t)) }
|
252
252
|
end
|
253
253
|
self
|
254
254
|
end
|
@@ -28,20 +28,27 @@ class SmqlToAR
|
|
28
28
|
def to_i() @vid end
|
29
29
|
end
|
30
30
|
|
31
|
+
class Aliases < Hash
|
32
|
+
def self.new prefix, *a, &e
|
33
|
+
e ||= lambda do |h, k|
|
34
|
+
j = Array.wrap( k).compact
|
35
|
+
h[k] = h.key?(j) ? h[j] : "#{prefix},#{j.collect( &:to_alias).join( ',')}"
|
36
|
+
end
|
37
|
+
super *a, &e
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
31
41
|
attr_reader :table_alias, :model, :table_model, :base_table, :_where, :_select, :_wobs, :_joins, :prefix, :_vid
|
32
42
|
attr_accessor :logger, :limit, :offset
|
33
43
|
|
34
44
|
def initialize model, prefix = nil
|
35
45
|
@prefix = "smql"
|
36
46
|
@logger = SmqlToAR.logger
|
37
|
-
@table_alias =
|
38
|
-
j = Array.wrap( k).compact
|
39
|
-
h[k] = h.key?(j) ? h[j] : "#{@prefix},#{j.join(',')}"
|
40
|
-
end
|
47
|
+
@table_alias = Aliases.new @prefix
|
41
48
|
@_vid, @_where, @_wobs, @model, @quoter = 0, SmqlToAR::And[], {}, model, model.connection
|
42
|
-
@base_table = [model.table_name
|
49
|
+
@base_table = [Column::Col.new( model.table_name)]
|
43
50
|
@table_alias[ @base_table] = @base_table.first
|
44
|
-
t = quote_table_name @
|
51
|
+
t = quote_table_name @base_table.first.col
|
45
52
|
@_select, @_joins, @_joined, @_includes, @_order = ["DISTINCT #{t}.*"], "", [@base_table], [], []
|
46
53
|
@table_model = {@base_table => @model}
|
47
54
|
end
|
@@ -49,7 +56,7 @@ class SmqlToAR
|
|
49
56
|
def vid() Vid.new( @_vid+=1) end
|
50
57
|
|
51
58
|
def inspect
|
52
|
-
"#<#{self.class.name}:#{"0x%x"% (self.object_id<<1)}|#{@prefix}:#{@base_table}:#{@model} vid=#{@_vid} where=#{@_where} wobs=#{@_wobs} select=#{@_select} aliases=#{@
|
59
|
+
"#<#{self.class.name}:#{"0x%x"% (self.object_id<<1)}|#{@prefix}:#{@base_table}:#{@model} vid=#{@_vid} where=#{@_where} wobs=#{@_wobs} select=#{@_select} aliases=#{@table_alias}>"
|
53
60
|
end
|
54
61
|
|
55
62
|
# Jede via where uebergebene Condition wird geodert und alle zusammen werden geundet.
|
@@ -71,11 +78,15 @@ class SmqlToAR
|
|
71
78
|
end
|
72
79
|
|
73
80
|
def quote_table_name name
|
81
|
+
name = case name
|
82
|
+
when Array, Column::Col then @table_alias[Array.wrap name]
|
83
|
+
else name.to_s
|
84
|
+
end
|
74
85
|
@quoter.quote_table_name( name).gsub /"\."/, ','
|
75
86
|
end
|
76
87
|
|
77
88
|
def column table, name
|
78
|
-
"#{quote_table_name table
|
89
|
+
"#{quote_table_name table}.#{quote_column_name name}"
|
79
90
|
end
|
80
91
|
|
81
92
|
def build_join orig, pretable, table, prekey, key
|
@@ -92,13 +103,13 @@ class SmqlToAR
|
|
92
103
|
@table_model[ table] = model
|
93
104
|
premodel = @table_model[ pretable]
|
94
105
|
t = @table_alias[ table]
|
95
|
-
pt = quote_table_name
|
96
|
-
refl = premodel.reflections[table.last]
|
106
|
+
pt = quote_table_name table[ 0...-1]
|
107
|
+
refl = premodel.reflections[table.last.to_sym]
|
97
108
|
case refl
|
98
109
|
when ActiveRecord::Reflection::ThroughReflection
|
99
110
|
through = refl.through_reflection
|
100
|
-
throughtable = table[0...-1]+[through.name.
|
101
|
-
srctable = throughtable+[refl.source_reflection.name]
|
111
|
+
throughtable = table[0...-1]+[Column::Col.new( through.name, table.last.as)]
|
112
|
+
srctable = throughtable+[Column::Col.new( refl.source_reflection.name, table.last.as)]
|
102
113
|
@table_model[ srctable] = model
|
103
114
|
@table_alias[ table] = @table_alias[ srctable]
|
104
115
|
join_ throughtable, through.klass, quote_table_name( through.table_name)
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.0.4.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Denis Knauf
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-22 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|