flounder 0.18.1 → 0.18.2
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/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
|