flounder 0.9.13 → 0.9.14
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/flounder.gemspec +1 -1
- data/lib/flounder/query/base.rb +40 -28
- data/lib/flounder/query/select.rb +1 -28
- data/qed/selects.md +4 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e5d88da3b8782b8bb2fb07e95392a2123f894cd
|
4
|
+
data.tar.gz: 9a166526a02b00dcb1095f1ce7a785d5f4a32034
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: add6543b9ef0cbf7670cedf9e7f976bb45a615bbe08d80ba6ec864dfdd3e8e78a057c7e40bed41e717db414582c6c5aaa0b52450ad23478229533cf42398f702
|
7
|
+
data.tar.gz: 4eca98ff56f180af2c35b0ef5f2e563297e87b1fb05b65ebfd908e2abd8612774cf7dc283d20d56ebbdc87be0d6dadb7f3d7d9a6d5be020d58353b5aae2ae22a
|
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.14'
|
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,33 +31,7 @@ module Flounder::Query
|
|
31
31
|
# query.where(:id.noteq => 1) # ... WHERE id != 1
|
32
32
|
#
|
33
33
|
def where *conditions
|
34
|
-
conditions
|
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 && entity_like?(conditions.first)
|
41
|
-
resolve_entity = convert_to_entity(conditions.shift)
|
42
|
-
end
|
43
|
-
|
44
|
-
# is this a hash? extract the first element
|
45
|
-
if conditions.size == 1 && conditions.first.kind_of?(Hash)
|
46
|
-
conditions = conditions.first
|
47
|
-
|
48
|
-
conditions.each do |k, v|
|
49
|
-
manager.where(transform_tuple(resolve_entity, k, v))
|
50
|
-
end
|
51
|
-
return self
|
52
|
-
end
|
53
|
-
|
54
|
-
# maybe conditions is of the second form?
|
55
|
-
conditions.each do |cond_str, *values|
|
56
|
-
manager.where(
|
57
|
-
Arel::Nodes::SqlLiteral.new(
|
58
|
-
rewrite_bind_variables(cond_str, bind_values.size, values.size)))
|
59
|
-
bind_values.concat values
|
60
|
-
end
|
34
|
+
parse_conditions(*conditions) { |bit| manager.where(bit) }
|
61
35
|
end
|
62
36
|
|
63
37
|
def with name, query
|
@@ -104,7 +78,45 @@ module Flounder::Query
|
|
104
78
|
# should be overridden
|
105
79
|
end
|
106
80
|
|
107
|
-
|
81
|
+
# Parses a conditions array like it is found with #where and #having and
|
82
|
+
# calls the block for each condition bit. Returns self.
|
83
|
+
#
|
84
|
+
# Example:
|
85
|
+
# parse_conditions(conditions) { |bit| manager.where(bit) }
|
86
|
+
#
|
87
|
+
def parse_conditions *conditions, &apply
|
88
|
+
conditions = conditions.dup
|
89
|
+
|
90
|
+
resolve_entity = entity
|
91
|
+
|
92
|
+
# is the first argument an entity? if yes, interpret field names relative
|
93
|
+
# to that entity.
|
94
|
+
if conditions.size > 1 && entity_like?(conditions.first)
|
95
|
+
resolve_entity = convert_to_entity(conditions.shift)
|
96
|
+
end
|
97
|
+
|
98
|
+
# is this a hash? extract the first element
|
99
|
+
if conditions.size == 1 && conditions.first.kind_of?(Hash)
|
100
|
+
conditions = conditions.first
|
101
|
+
|
102
|
+
conditions.each do |k, v|
|
103
|
+
apply.call(
|
104
|
+
transform_tuple(resolve_entity, k, v))
|
105
|
+
end
|
106
|
+
return self
|
107
|
+
end
|
108
|
+
|
109
|
+
# maybe conditions is of the second form?
|
110
|
+
conditions.each do |cond_str, *values|
|
111
|
+
apply.call(
|
112
|
+
Arel::Nodes::SqlLiteral.new(
|
113
|
+
rewrite_bind_variables(cond_str, bind_values.size, values.size)))
|
114
|
+
bind_values.concat values
|
115
|
+
end
|
116
|
+
return self
|
117
|
+
end
|
118
|
+
|
119
|
+
# Rewrites a statement that contains bind placeholders like '$1' to
|
108
120
|
# contain placeholders starting at offset+1. Also checks that no
|
109
121
|
# placeholder exceeds the limit.
|
110
122
|
#
|
@@ -92,34 +92,7 @@ module Flounder::Query
|
|
92
92
|
self
|
93
93
|
end
|
94
94
|
def having *conditions
|
95
|
-
|
96
|
-
conditions = conditions.dup
|
97
|
-
|
98
|
-
resolve_entity = entity
|
99
|
-
|
100
|
-
# is the first argument an entity? if yes, interpret field names relative
|
101
|
-
# to that entity.
|
102
|
-
if conditions.size > 1 && entity_like?(conditions.first)
|
103
|
-
resolve_entity = convert_to_entity(conditions.shift)
|
104
|
-
end
|
105
|
-
|
106
|
-
# is this a hash? extract the first element
|
107
|
-
if conditions.size == 1 && conditions.first.kind_of?(Hash)
|
108
|
-
conditions = conditions.first
|
109
|
-
|
110
|
-
conditions.each do |k, v|
|
111
|
-
manager.having(transform_tuple(resolve_entity, k, v))
|
112
|
-
end
|
113
|
-
return self
|
114
|
-
end
|
115
|
-
|
116
|
-
# maybe conditions is of the second form?
|
117
|
-
conditions.each do |cond_str, *values|
|
118
|
-
manager.where(
|
119
|
-
Arel::Nodes::SqlLiteral.new(
|
120
|
-
rewrite_bind_variables(cond_str, bind_values.size, values.size)))
|
121
|
-
bind_values.concat values
|
122
|
-
end
|
95
|
+
parse_conditions(*conditions) { |bit| manager.having(bit) }
|
123
96
|
end
|
124
97
|
|
125
98
|
# Orders by a list of field references.
|
data/qed/selects.md
CHANGED
@@ -67,6 +67,9 @@ Sometimes you have to say it with a subquery. For example, you might want to loo
|
|
67
67
|
# GROUP BY and HAVING
|
68
68
|
|
69
69
|
~~~ruby
|
70
|
-
posts.group_by(:id).having(id: 0, user_id: 2).
|
70
|
+
posts.group_by(:id).having(id: 0, user_id: 2).project('id').
|
71
71
|
assert generates_sql("SELECT [fields] FROM \"posts\" GROUP BY \"posts\".\"id\" HAVING \"posts\".\"id\" = 0 AND \"posts\".\"user_id\" = 2")
|
72
|
+
|
73
|
+
posts.group_by(:id).having('id = 1').project('id').
|
74
|
+
assert generates_sql("SELECT [fields] FROM \"posts\" GROUP BY \"posts\".\"id\" HAVING id = 1")
|
72
75
|
~~~
|