flounder 0.17.0 → 0.18.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 787c40edcbbb187dfe3103cf3ac536b8f36da6ab
4
- data.tar.gz: 7b4d0797c663cebaabe2a6535370129db329ef5d
3
+ metadata.gz: 212f1134237b0adfe5f4f94d8f79d508a2997ce9
4
+ data.tar.gz: e093b402cf0cf81c9b01c178ac6b20847d4b9403
5
5
  SHA512:
6
- metadata.gz: b9468c1b7af2c48c491f310103e78e201b7963f13422fdb1f83b6b8731b3f441e48a32931ee244eb3a68504d7789b178f84efaa1b75228944e6a7caba3628d21
7
- data.tar.gz: 7d9e0fd8257ac9956b8e03791f6d6b7470c307c06609f265523f66e08720198b5b3f6170ec4038f56afced3c7a832c41b27dc3abab624804856f9ba233d876b5
6
+ metadata.gz: 8444a433354c815819d087c8c44d85bb56b3389d452d6f5ab554927e22a056763eda19383be7bd94cc4cf5c9d87b8452a61de254de30283acda9b33a881a60e7
7
+ data.tar.gz: 334f3c8a41c8b26ba4cf86f6ec8e36813106c4015daa2110d84a190d82854612097cb0dcbbefdf199114e72f5930d71c1798f4ae97aa86b5c221eaf317049e6a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flounder (0.16.0)
4
+ flounder (0.17.0)
5
5
  aggregate (~> 0.2, >= 0.2.2)
6
6
  arel (~> 5, > 5.0.1)
7
7
  connection_pool (~> 2)
data/HISTORY CHANGED
@@ -1,3 +1,6 @@
1
+ # 0.18
2
+ + Allows usage of relation names in where clauses.
3
+
1
4
  # 0.17
2
5
  + A call to order_by fully replaces previously set ordering.
3
6
 
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.17.0'
5
+ s.version = '0.18.0'
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"
@@ -1,15 +1,25 @@
1
1
  module Flounder::Helpers
2
+
3
+ # Helper module that helps with entity resolution. To include this module in
4
+ # a class, you need to provide the following two methods:
5
+ #
6
+ # * has_entity?(sym) -> Boolean
7
+ # Decides if a given symbol can be converted into an entity
8
+ # * resolve_entity(sym) -> Entity
9
+ # Resolves an entity from a symbol name.
10
+ #
2
11
  module Entity
3
12
  def entity_like? something
4
13
  something.kind_of?(Flounder::Entity) ||
5
- something.kind_of?(Symbol) && domain.has_entity?(something)
14
+ something.kind_of?(Flounder::EntityAlias) ||
15
+ something.kind_of?(Symbol) && has_entity?(something)
6
16
  end
7
17
  def convert_to_entity something
8
18
  case something
9
19
  when Flounder::Entity, Flounder::EntityAlias
10
20
  return something
11
21
  when Symbol
12
- return domain[something]
22
+ return resolve_entity(something)
13
23
  else
14
24
  fail "Not entity-like - yet! (#{something.inspect})"
15
25
  end
@@ -139,6 +139,18 @@ module Flounder::Query
139
139
  # should be overridden
140
140
  end
141
141
 
142
+ # Checks if a given symbol can be an entity after resolution.
143
+ #
144
+ def has_entity? sym
145
+ domain.has_entity?(sym)
146
+ end
147
+
148
+ # Resolves an entity through the domain.
149
+ #
150
+ def resolve_entity sym
151
+ domain[sym]
152
+ end
153
+
142
154
  # Rewrites a statement that contains bind placeholders like '$1' to
143
155
  # contain placeholders starting at offset+1. Also checks that no
144
156
  # placeholder exceeds the limit.
@@ -40,11 +40,16 @@ module Flounder::Query
40
40
 
41
41
  attr_reader :join_entity, :last_join
42
42
 
43
+ # maps relations that were included in this select to their entities.
44
+ attr_reader :relation_entity_map
45
+
43
46
  def _join join_node, entity
44
47
  entity = convert_to_entity(entity)
45
48
 
46
49
  @last_join = entity
47
50
 
51
+ @relation_entity_map = {}
52
+
48
53
  table = entity.table
49
54
  manager.join(table, join_node)
50
55
  add_fields_to_default(entity)
@@ -168,6 +173,24 @@ module Flounder::Query
168
173
  end
169
174
 
170
175
  private
176
+ # Checks if a symbol can be turned into an entity. Overwritten from base
177
+ # query because we want to allow entity names that are introduced through
178
+ # #connect as well.
179
+ #
180
+ def has_entity? sym
181
+ super || relation_entity_map.has_key?(sym)
182
+ end
183
+
184
+ # Resolves an entity through the domain. Overwritten from base query because
185
+ # we want to allow entity names that are introduced through #connect as
186
+ # well.
187
+ #
188
+ def resolve_entity sym
189
+ return domain[sym] if domain.has_entity?(sym)
190
+ return relation_entity_map[sym] if relation_entity_map.has_key?(sym)
191
+
192
+ raise NoSuchEntity, "No such entity #{sym.inspect} either in this select statement or in the domain."
193
+ end
171
194
 
172
195
  # Follows a given relationship spec. Does NOT change anchoring.
173
196
  #
@@ -178,7 +201,10 @@ module Flounder::Query
178
201
  when Symbol
179
202
  relation = entity.relations[spec]
180
203
  raise "No such relation #{spec.inspect} on entity #{entity}." unless relation
204
+
181
205
  relation.apply(self)
206
+ relation_entity_map[spec] = relation.linked_entity
207
+
182
208
  when Hash
183
209
  spec.each do |k, v|
184
210
  follow_relation_spec(join_entity, k)
@@ -186,6 +212,7 @@ module Flounder::Query
186
212
 
187
213
  follow_relation_spec(join_entity, v)
188
214
  end
215
+
189
216
  when Array
190
217
  spec.each do |v|
191
218
  follow_relation_spec(join_entity, v)
@@ -10,21 +10,40 @@ module Flounder
10
10
  domain, type, name, entity_ref, join_conditions
11
11
  end
12
12
 
13
- def apply query
14
- entity = convert_to_entity(entity_ref)
13
+ def linked_entity
14
+ @linked_entity ||= begin
15
+ entity = convert_to_entity(entity_ref)
16
+
17
+ if name != entity_ref
18
+ # TODO maybe using name for both singular and plural is not a good
19
+ # idea. Maybe it is.
20
+ entity = entity.as(name, name)
21
+ end
15
22
 
16
- if name != entity_ref
17
- # TODO maybe using name for both singular and plural is not a good idea.
18
- # Maybe it is.
19
- entity = entity.as(name, name)
23
+ entity
20
24
  end
25
+ end
21
26
 
27
+ def apply query
22
28
  query.
23
- join(entity).
29
+ join(linked_entity).
24
30
  on(join_conditions)
25
- end
31
+ end
26
32
 
27
33
  private
34
+ # Checks if a given symbol can be an entity after resolution.
35
+ #
36
+ def has_entity? sym
37
+ domain.has_entity?(sym)
38
+ end
39
+
40
+ # Resolves an entity through the domain.
41
+ #
42
+ def resolve_entity sym
43
+ domain[sym]
44
+ end
45
+
46
+ # Now that the above two methods exist, we can use this helper:
28
47
  include Flounder::Helpers::Entity
29
48
  end
30
49
  end
data/qed/joins.md CHANGED
@@ -105,11 +105,17 @@ Or a more complicated example, using hashes and arrays in the join specification
105
105
 
106
106
  ~~~ruby
107
107
  # Query for users, joining posts and joining comments from posts (anchor)
108
- query = users.connect(:posts => [:comments, :approver])
108
+ query = users.
109
+ connect(:posts => [:comments, :approver]).
110
+ where(:approver, id: 1)
109
111
 
112
+ # This manual route is of course always available.
113
+ approver = users.as(:approver, :approver)
110
114
  users.
111
115
  join(:posts).on(:id => :author_id).anchor.
112
116
  join(:comments).on(:id => :post_id).
113
- join(users.as(:approver, :approver)).on(:author_id => :id).to_sql.assert == query.to_sql
117
+ join(approver).on(:author_id => :id).
118
+ where(approver, id: 1).
119
+ to_sql.assert == query.to_sql
114
120
  ~~~
115
121
 
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.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaspar Schiess
@@ -9,114 +9,114 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-11-12 00:00:00.000000000 Z
12
+ date: 2014-11-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: arel
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ~>
19
19
  - !ruby/object:Gem::Version
20
20
  version: '5'
21
- - - ">"
21
+ - - '>'
22
22
  - !ruby/object:Gem::Version
23
23
  version: 5.0.1
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - "~>"
28
+ - - ~>
29
29
  - !ruby/object:Gem::Version
30
30
  version: '5'
31
- - - ">"
31
+ - - '>'
32
32
  - !ruby/object:Gem::Version
33
33
  version: 5.0.1
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: pg
36
36
  requirement: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.17'
41
41
  type: :runtime
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.17'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: hashie
50
50
  requirement: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3'
55
- - - ">="
55
+ - - '>='
56
56
  - !ruby/object:Gem::Version
57
57
  version: '3.2'
58
58
  type: :runtime
59
59
  prerelease: false
60
60
  version_requirements: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - "~>"
62
+ - - ~>
63
63
  - !ruby/object:Gem::Version
64
64
  version: '3'
65
- - - ">="
65
+ - - '>='
66
66
  - !ruby/object:Gem::Version
67
67
  version: '3.2'
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: connection_pool
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - "~>"
72
+ - - ~>
73
73
  - !ruby/object:Gem::Version
74
74
  version: '2'
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ~>
80
80
  - !ruby/object:Gem::Version
81
81
  version: '2'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: pg-hstore
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - "~>"
86
+ - - ~>
87
87
  - !ruby/object:Gem::Version
88
88
  version: '1.2'
89
- - - ">="
89
+ - - '>='
90
90
  - !ruby/object:Gem::Version
91
91
  version: 1.2.0
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - "~>"
96
+ - - ~>
97
97
  - !ruby/object:Gem::Version
98
98
  version: '1.2'
99
- - - ">="
99
+ - - '>='
100
100
  - !ruby/object:Gem::Version
101
101
  version: 1.2.0
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: aggregate
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
- - - "~>"
106
+ - - ~>
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0.2'
109
- - - ">="
109
+ - - '>='
110
110
  - !ruby/object:Gem::Version
111
111
  version: 0.2.2
112
112
  type: :runtime
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - "~>"
116
+ - - ~>
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0.2'
119
- - - ">="
119
+ - - '>='
120
120
  - !ruby/object:Gem::Version
121
121
  version: 0.2.2
122
122
  description: " Flounder is the missing piece between the database and your Ruby
@@ -127,14 +127,11 @@ executables: []
127
127
  extensions: []
128
128
  extra_rdoc_files: []
129
129
  files:
130
+ - flounder.gemspec
130
131
  - Gemfile
131
132
  - Gemfile.lock
132
133
  - HACKING
133
134
  - HISTORY
134
- - LICENSE
135
- - README
136
- - flounder.gemspec
137
- - lib/flounder.rb
138
135
  - lib/flounder/connection.rb
139
136
  - lib/flounder/connection_pool.rb
140
137
  - lib/flounder/domain.rb
@@ -155,6 +152,8 @@ files:
155
152
  - lib/flounder/query/update.rb
156
153
  - lib/flounder/relation.rb
157
154
  - lib/flounder/symbol_extensions.rb
155
+ - lib/flounder.rb
156
+ - LICENSE
158
157
  - qed/applique/ae.rb
159
158
  - qed/applique/flounder.rb
160
159
  - qed/applique/setup_domain.rb
@@ -173,6 +172,7 @@ files:
173
172
  - qed/projection.md
174
173
  - qed/selects.md
175
174
  - qed/updates.md
175
+ - README
176
176
  homepage: https://bitbucket.org/technologyastronauts/oss_flounder
177
177
  licenses:
178
178
  - MIT
@@ -183,17 +183,17 @@ require_paths:
183
183
  - lib
184
184
  required_ruby_version: !ruby/object:Gem::Requirement
185
185
  requirements:
186
- - - ">="
186
+ - - '>='
187
187
  - !ruby/object:Gem::Version
188
188
  version: '0'
189
189
  required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  requirements:
191
- - - ">="
191
+ - - '>='
192
192
  - !ruby/object:Gem::Version
193
193
  version: '0'
194
194
  requirements: []
195
195
  rubyforge_project:
196
- rubygems_version: 2.2.2
196
+ rubygems_version: 2.0.14
197
197
  signing_key:
198
198
  specification_version: 4
199
199
  summary: Flounder is a way to write SQL simply in Ruby. It deals with everything BUT
@@ -217,4 +217,3 @@ test_files:
217
217
  - qed/projection.md
218
218
  - qed/selects.md
219
219
  - qed/updates.md
220
- has_rdoc: