flounder 0.18.1 → 0.18.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -3
- data/HISTORY +1 -0
- data/flounder.gemspec +1 -1
- data/lib/flounder/domain.rb +16 -8
- data/qed/projection.md +22 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f60fabc94bf34a924e2415c6afeef19c98d565c9
|
4
|
+
data.tar.gz: 831d3c9e63fcecc02fc7b82f8814159358341435
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb48e10532ba0c3febdc3aa57c4d1671ab24b8990c6e16539f11a91971c2ac1fc5e3440ea5e51710fd1a58155bf9903668c5480b87f7cffa1d43bcd04c971a55
|
7
|
+
data.tar.gz: feffebf6cf853a97f1d240c4cebcf482bd9f77084efe6dbdcc38079e3a12dd2cf9c2c13736e9001d22abf04c31f9d3c8bec551c67b75cfed68df6fe82cd0e417
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
flounder (0.18.
|
4
|
+
flounder (0.18.1)
|
5
5
|
aggregate (~> 0.2, >= 0.2.2)
|
6
6
|
arel (~> 5, > 5.0.1)
|
7
7
|
connection_pool (~> 2)
|
@@ -18,9 +18,9 @@ GEM
|
|
18
18
|
ansi (1.4.3)
|
19
19
|
arel (5.0.1.20140414130214)
|
20
20
|
brass (1.2.1)
|
21
|
-
connection_pool (2.
|
21
|
+
connection_pool (2.1.0)
|
22
22
|
facets (2.9.3)
|
23
|
-
hashie (3.3.
|
23
|
+
hashie (3.3.2)
|
24
24
|
pg (0.17.1)
|
25
25
|
pg-hstore (1.2.0)
|
26
26
|
qed (2.9.1)
|
data/HISTORY
CHANGED
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.18.
|
5
|
+
s.version = '0.18.2'
|
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/domain.rb
CHANGED
@@ -22,8 +22,13 @@ module Flounder
|
|
22
22
|
@plural = {}
|
23
23
|
@singular = {}
|
24
24
|
|
25
|
+
# Maps table names to entities
|
26
|
+
@entity_by_table_name = {}
|
27
|
+
|
25
28
|
# maps OIDs of entities to entities
|
26
|
-
@oids_entity_map = {
|
29
|
+
@oids_entity_map = Hash.new { |hash, oid|
|
30
|
+
hash[oid] = entity_from_oid(oid)
|
31
|
+
}
|
27
32
|
|
28
33
|
@logger = Logger.new(NilDevice.new)
|
29
34
|
|
@@ -109,11 +114,12 @@ module Flounder
|
|
109
114
|
entity = Entity.new(self, plural, singular, table_name).
|
110
115
|
tap { |e| yield e if block_given? }
|
111
116
|
|
117
|
+
raise ArgumentError, "Table #{table_name} was already associated with an entity." \
|
118
|
+
if @entity_by_table_name.has_key?(table_name)
|
119
|
+
|
112
120
|
@plural[plural] = entity
|
113
121
|
@singular[singular] = entity
|
114
|
-
|
115
|
-
# Also maps OID to entities for field resolution
|
116
|
-
@oids_entity_map[table_oid(table_name)] = entity
|
122
|
+
@entity_by_table_name[table_name] = entity
|
117
123
|
|
118
124
|
entity
|
119
125
|
end
|
@@ -121,6 +127,7 @@ module Flounder
|
|
121
127
|
# Returns an entity by table oid.
|
122
128
|
#
|
123
129
|
def by_oid oid
|
130
|
+
return nil if oid==0 # computed fields
|
124
131
|
@oids_entity_map[oid]
|
125
132
|
end
|
126
133
|
|
@@ -157,11 +164,12 @@ module Flounder
|
|
157
164
|
end
|
158
165
|
end
|
159
166
|
|
160
|
-
def
|
167
|
+
def entity_from_oid oid
|
161
168
|
connection_pool.with_connection do |conn|
|
162
|
-
#
|
163
|
-
|
164
|
-
|
169
|
+
table_name = conn.exec(%Q(SELECT #{oid}::regclass)).
|
170
|
+
getvalue(0,0)
|
171
|
+
|
172
|
+
@entity_by_table_name[table_name]
|
165
173
|
end
|
166
174
|
end
|
167
175
|
end
|
data/qed/projection.md
CHANGED
@@ -19,7 +19,7 @@ When projecting, all result data will be toplevel and only the projected data is
|
|
19
19
|
project(users[:name]).first
|
20
20
|
|
21
21
|
result.id.assert == nil # Not loaded.
|
22
|
-
result.name.assert == 'John Snow'
|
22
|
+
result.user.name.assert == 'John Snow'
|
23
23
|
~~~
|
24
24
|
|
25
25
|
Otherwise a projected query can be treated like an ordinary query, including appending stuff by joining it in.
|
@@ -33,3 +33,24 @@ Otherwise a projected query can be treated like an ordinary query, including app
|
|
33
33
|
post.user.name.assert == 'John Snow'
|
34
34
|
post.approver.name.assert == 'John Doe'
|
35
35
|
~~~
|
36
|
+
|
37
|
+
The same (by name) field can be used from multiple tables without issues.
|
38
|
+
|
39
|
+
~~~ruby
|
40
|
+
result = posts.
|
41
|
+
join(users).on(:user_id => :id).
|
42
|
+
project(users[:id], users[:name], posts[:id], posts[:title]).
|
43
|
+
first
|
44
|
+
|
45
|
+
result.title.assert == "First Light"
|
46
|
+
result.post.title.assert == "First Light"
|
47
|
+
result.user.name.assert == 'John Snow'
|
48
|
+
~~~
|
49
|
+
|
50
|
+
Fields that are created during the select are toplevel as well.
|
51
|
+
|
52
|
+
~~~ruby
|
53
|
+
result = posts.project('42 as answer').first
|
54
|
+
result.answer.assert = 42
|
55
|
+
~~~
|
56
|
+
|
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.18.
|
4
|
+
version: 0.18.2
|
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-
|
12
|
+
date: 2014-12-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: arel
|