flounder 0.9.7 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY +2 -11
- data/flounder.gemspec +1 -1
- data/lib/flounder/query/base.rb +25 -5
- data/lib/flounder/query/select.rb +1 -5
- data/lib/flounder/symbol_extensions.rb +1 -2
- data/lib/flounder.rb +5 -0
- data/qed/applique/setup_domain.rb +3 -1
- data/qed/index.md +7 -14
- data/qed/selects.md +1 -1
- metadata +2 -4
- data/Gemfile.lock +0 -33
- data/flounder-0.9.6.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b671fc956d5fcd73817cdc07ec5e9dbd5b03751
|
4
|
+
data.tar.gz: 1a6cf5f585030c036c5bd57abf4450d25103e529
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7803a9083fa04f1f3c0cef3ac9a781f699c55194676e4f362f610a38ff663f3893d07dc1de5da525eaafada13935bbc34c44f56e40218962096790c96e776d69
|
7
|
+
data.tar.gz: 409cd4865b56744ae81129d6cc3eee861fb050c37bcda5943acad18885dca809e1d6c5fb779ce2bc220d33ebcd3171b1e8c84bf81367d92bbf6db827c82221f4
|
data/HISTORY
CHANGED
@@ -5,19 +5,10 @@
|
|
5
5
|
+ You now need to call `#kick` when performing an insert or an update
|
6
6
|
to get it to really happen. Please see our documentation in qed/*.
|
7
7
|
+ `domain.transaction do |conn| ... end`
|
8
|
-
|
9
|
-
0.9.1
|
10
8
|
+ `search_path` argument for `Flounder.connect`.
|
11
|
-
|
12
|
-
0.9.2
|
13
9
|
+ bind variables on INSERT/UPDATE.
|
14
|
-
|
15
|
-
0.9.3
|
16
10
|
+ DELETE FROM - entity#delete
|
17
|
-
|
18
|
-
0.9.4
|
19
11
|
+ nested transactions
|
20
|
-
|
21
|
-
0.9.5
|
22
12
|
+ subquery support
|
23
|
-
|
13
|
+
+ localized where as in where(entity, :field => value)
|
14
|
+
+ db.where(entity, hash) form, where all symbols are looked up in entity.
|
data/flounder.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "flounder"
|
5
|
-
s.version = '0.9.
|
5
|
+
s.version = '0.9.8'
|
6
6
|
s.summary = "Flounder is a way to write SQL simply in Ruby. It deals with everything BUT object relational mapping. "
|
7
7
|
s.email = "kaspar.schiess@technologyastronauts.ch"
|
8
8
|
s.homepage = "https://bitbucket.org/technologyastronauts/oss_flounder"
|
data/lib/flounder/query/base.rb
CHANGED
@@ -31,12 +31,22 @@ module Flounder::Query
|
|
31
31
|
# query.where(:id.noteq => 1) # ... WHERE id != 1
|
32
32
|
#
|
33
33
|
def where *conditions
|
34
|
+
conditions = conditions.dup
|
35
|
+
|
36
|
+
resolve_entity = entity
|
37
|
+
|
38
|
+
# is the first argument an entity? if yes, interpret field names relative
|
39
|
+
# to that entity.
|
40
|
+
if conditions.size > 1 && conditions.first.kind_of?(Flounder::Entity)
|
41
|
+
resolve_entity = conditions.shift
|
42
|
+
end
|
43
|
+
|
34
44
|
# is this a hash? extract the first element
|
35
45
|
if conditions.size == 1 && conditions.first.kind_of?(Hash)
|
36
46
|
conditions = conditions.first
|
37
47
|
|
38
48
|
conditions.each do |k, v|
|
39
|
-
manager.where(transform_tuple(k, v))
|
49
|
+
manager.where(transform_tuple(resolve_entity, k, v))
|
40
50
|
end
|
41
51
|
return self
|
42
52
|
end
|
@@ -125,21 +135,31 @@ module Flounder::Query
|
|
125
135
|
# * #where
|
126
136
|
# * #on
|
127
137
|
#
|
128
|
-
def transform_tuple field, value
|
138
|
+
def transform_tuple entity, field, value
|
129
139
|
if value.kind_of? Flounder::Field
|
130
140
|
value = value.arel_field
|
131
141
|
end
|
132
142
|
|
143
|
+
if defined?(DataMapper) &&
|
144
|
+
defined?(DataMapper::Query::Operator) &&
|
145
|
+
field.kind_of?(DataMapper::Query::Operator)
|
146
|
+
|
147
|
+
# interop: datamapper hijacks some of our operators, let's reverse this
|
148
|
+
field = Flounder::SymbolExtensions::Modifier.new(
|
149
|
+
field.target, field.operator)
|
150
|
+
end
|
151
|
+
|
133
152
|
case field
|
134
153
|
# covers: :field_a => ...
|
135
154
|
when Symbol
|
136
|
-
join_and_condition_part(entity[field].arel_field, value)
|
155
|
+
join_and_condition_part(entity, entity[field].arel_field, value)
|
137
156
|
# covers: entity[:field] => ...
|
138
157
|
when Flounder::Field
|
139
|
-
join_and_condition_part(field.arel_field, value)
|
158
|
+
join_and_condition_part(entity, field.arel_field, value)
|
140
159
|
# covers: :field_a.noteq => ...
|
141
160
|
when Flounder::SymbolExtensions::Modifier
|
142
161
|
join_and_condition_part(
|
162
|
+
entity,
|
143
163
|
field.to_arel_field(entity),
|
144
164
|
value,
|
145
165
|
field.kind)
|
@@ -147,7 +167,7 @@ module Flounder::Query
|
|
147
167
|
fail "Could not transform condition part. (#{field.inspect}, #{value.inspect})"
|
148
168
|
end
|
149
169
|
end
|
150
|
-
def join_and_condition_part arel_field, value, kind=:eq
|
170
|
+
def join_and_condition_part entity, arel_field, value, kind=:eq
|
151
171
|
case value
|
152
172
|
# covers subselects
|
153
173
|
when Flounder::Query::Base
|
@@ -31,10 +31,6 @@ module Flounder::Query
|
|
31
31
|
attr_reader :projection_prefixes
|
32
32
|
|
33
33
|
def _join join_node, entity
|
34
|
-
if entity.kind_of?(Symbol)
|
35
|
-
entity = domain[entity]
|
36
|
-
end
|
37
|
-
|
38
34
|
@last_join = entity
|
39
35
|
|
40
36
|
table = entity.table
|
@@ -70,7 +66,7 @@ module Flounder::Query
|
|
70
66
|
def on join_conditions
|
71
67
|
join_conditions.each do |k, v|
|
72
68
|
manager.on(
|
73
|
-
transform_tuple(k, join_field(v)))
|
69
|
+
transform_tuple(entity, k, join_field(v)))
|
74
70
|
end
|
75
71
|
self
|
76
72
|
end
|
@@ -16,8 +16,7 @@ module Flounder
|
|
16
16
|
# NOTE mixing comparison ops with asc and desc is nasty, but not really
|
17
17
|
# relevant. Errors will get raised later on - we're not in the business of
|
18
18
|
# checking your SQL for validity.
|
19
|
-
[:not_eq, :lt, :gt, :gteq, :lteq, :matches, :
|
20
|
-
:asc, :desc].each do |kind|
|
19
|
+
[:not_eq, :lt, :gt, :gteq, :lteq, :matches, :asc, :desc].each do |kind|
|
21
20
|
define_method kind do
|
22
21
|
Modifier.new(self, kind)
|
23
22
|
end
|
data/lib/flounder.rb
CHANGED
@@ -31,6 +31,11 @@ module_function
|
|
31
31
|
def domain connection, &block
|
32
32
|
Domain.new(connection).tap { |d| yield d if block_given? }
|
33
33
|
end
|
34
|
+
|
35
|
+
def literal str
|
36
|
+
Arel::Nodes::SqlLiteral.new(str)
|
37
|
+
end
|
38
|
+
module_function :literal
|
34
39
|
end
|
35
40
|
|
36
41
|
Symbol.send(:include, Flounder::SymbolExtensions)
|
@@ -22,6 +22,8 @@ end
|
|
22
22
|
#
|
23
23
|
# One fine day we will use transactional features.
|
24
24
|
#
|
25
|
-
|
25
|
+
require 'pathname'
|
26
|
+
sql = Pathname.new(__FILE__).dirname.join('../..').join('qed/flounder.sql')
|
27
|
+
File.open sql do |file|
|
26
28
|
Flounder::Engine.new(domain.connection_pool).exec file.read
|
27
29
|
end
|
data/qed/index.md
CHANGED
@@ -46,10 +46,6 @@ Also, several conditions work as one would expect from DataMapper.
|
|
46
46
|
"SELECT [fields] FROM \"users\" WHERE \"users\".\"id\" >= 10")
|
47
47
|
domain[:users].where(:id.not_eq => 10).assert generates_sql(
|
48
48
|
"SELECT [fields] FROM \"users\" WHERE \"users\".\"id\" != 10")
|
49
|
-
domain[:users].where(:id.in => [1,2,3]).assert generates_sql(
|
50
|
-
"SELECT [fields] FROM \"users\" WHERE \"users\".\"id\" IN (1, 2, 3)")
|
51
|
-
domain[:users].where(:id.not_in => [1,2,3]).assert generates_sql(
|
52
|
-
"SELECT [fields] FROM \"users\" WHERE \"users\".\"id\" NOT IN (1, 2, 3)")
|
53
49
|
~~~
|
54
50
|
|
55
51
|
Fields can be used fully qualified by going through the entity.
|
@@ -67,6 +63,13 @@ Fields can be used fully qualified by going through the entity.
|
|
67
63
|
assert generates_sql("SELECT [fields] FROM \"users\" WHERE \"users\".\"user_id\" = \"users\".\"approver_id\"")
|
68
64
|
~~~
|
69
65
|
|
66
|
+
By default, symbols are interpreted as field names in the entity that you start your query with. But you can localize your `#where` clause to any other entity.
|
67
|
+
|
68
|
+
~~~ruby
|
69
|
+
users.where(posts, :id => 1).
|
70
|
+
assert generates_sql("SELECT [fields] FROM \"users\" WHERE \"posts\".\"id\" = 1")
|
71
|
+
~~~
|
72
|
+
|
70
73
|
# Some JOINs
|
71
74
|
|
72
75
|
Here are some non-crazy joins that also work.
|
@@ -79,16 +82,6 @@ Here are some non-crazy joins that also work.
|
|
79
82
|
assert generates_sql(%Q(SELECT [fields] FROM "users" LEFT OUTER JOIN "posts" ON "users"."id" = "posts"."user_id"))
|
80
83
|
~~~
|
81
84
|
|
82
|
-
Join also accepts symbols as argument - these will be turned into entities.
|
83
|
-
|
84
|
-
~~~ruby
|
85
|
-
domain[:users].join(:posts).on(:id => :user_id).
|
86
|
-
assert generates_sql(%Q(SELECT [fields] FROM "users" INNER JOIN "posts" ON "users"."id" = "posts"."user_id"))
|
87
|
-
|
88
|
-
domain[:users].outer_join(:posts).on(:id => :user_id).
|
89
|
-
assert generates_sql(%Q(SELECT [fields] FROM "users" LEFT OUTER JOIN "posts" ON "users"."id" = "posts"."user_id"))
|
90
|
-
~~~
|
91
|
-
|
92
85
|
Joining presents an interesting dilemma. There are two ways of joining things together, given three tables. The sequence A.B.C might mean to join A to B and C; it might also be interpreted to mean to join A to B and B to C. Here's how we solve this.
|
93
86
|
|
94
87
|
~~~ruby
|
data/qed/selects.md
CHANGED
@@ -56,7 +56,7 @@ Sometimes you have to say it with a subquery. For example, you might want to loo
|
|
56
56
|
where(:approver_id => domain[:users][:id]).limit(1)
|
57
57
|
|
58
58
|
query = domain[:users].
|
59
|
-
join(posts).on(
|
59
|
+
join(posts).on(posts[:id] => last_post)
|
60
60
|
|
61
61
|
query.assert generates_sql(%Q(SELECT [fields] FROM "users" INNER JOIN "posts" ON "posts"."id" = (SELECT "posts"."id" FROM "posts" WHERE "posts"."approver_id" = "users"."id" ORDER BY "posts"."id" DESC LIMIT 1)))
|
62
62
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flounder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kaspar Schiess
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: arel
|
@@ -88,12 +88,10 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- Gemfile
|
91
|
-
- Gemfile.lock
|
92
91
|
- HACKING
|
93
92
|
- HISTORY
|
94
93
|
- LICENSE
|
95
94
|
- README
|
96
|
-
- flounder-0.9.6.gem
|
97
95
|
- flounder.gemspec
|
98
96
|
- lib/flounder.rb
|
99
97
|
- lib/flounder/connection.rb
|
data/Gemfile.lock
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
flounder (0.8.1)
|
5
|
-
arel (~> 5, > 5.0.1)
|
6
|
-
connection_pool (~> 2)
|
7
|
-
hashie (~> 3, >= 3.2)
|
8
|
-
pg (> 0.17)
|
9
|
-
|
10
|
-
GEM
|
11
|
-
remote: https://rubygems.org/
|
12
|
-
specs:
|
13
|
-
ae (1.8.2)
|
14
|
-
ansi
|
15
|
-
ansi (1.4.3)
|
16
|
-
arel (5.0.1.20140414130214)
|
17
|
-
brass (1.2.1)
|
18
|
-
connection_pool (2.0.0)
|
19
|
-
facets (2.9.3)
|
20
|
-
hashie (3.2.0)
|
21
|
-
pg (0.17.1)
|
22
|
-
qed (2.9.1)
|
23
|
-
ansi
|
24
|
-
brass
|
25
|
-
facets (>= 2.8)
|
26
|
-
|
27
|
-
PLATFORMS
|
28
|
-
ruby
|
29
|
-
|
30
|
-
DEPENDENCIES
|
31
|
-
ae
|
32
|
-
flounder!
|
33
|
-
qed
|
data/flounder-0.9.6.gem
DELETED
Binary file
|