rao-query 0.0.32.pre → 0.0.33.pre
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/Rakefile +2 -8
- data/app/concerns/rao/query/controller/query_concern.rb +2 -4
- data/app/form_builders/rao/query/form_builder.rb +8 -8
- data/app/parsers/rao/query/condition_parser.rb +14 -26
- data/config/locales/de.yml +6 -1
- data/config/locales/en.yml +6 -1
- data/lib/rao/query.rb +1 -0
- data/lib/rao/query/operators.rb +31 -0
- metadata +59 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bf02e4d6062bd64bb3206afd970320b7dc2d284ac792f538d3207cf5bd648bd
|
4
|
+
data.tar.gz: 3835923ea7e41165c576769a9e5b415278eda5ee3a3d804cf85064c452f60cd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1932ba6136ccc01c9652515782a838ae17837ea2f395a097ace5d791c6638060498dfc1e72a6fd73b6b6087007ac353edceb0052be3b94d5dbfc2dd414893b50
|
7
|
+
data.tar.gz: 58b279a8c3706ae7f1748342eef84661d1649f8080522184211e66568556ef9d529ca305740d9d7f6e4de38f82bef2534cb6440884cf00f3fb73c8b4304d286b
|
data/Rakefile
CHANGED
@@ -14,12 +14,6 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
load 'rails/tasks/engine.rake'
|
17
|
+
Bundler::GemHelper.install_tasks
|
19
18
|
|
20
|
-
|
21
|
-
load 'rails/tasks/statistics.rake'
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
require 'bundler/gem_tasks'
|
19
|
+
require 'rails/dummy/tasks'
|
@@ -60,10 +60,8 @@ module Rao
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def normalize_key(key)
|
63
|
-
|
64
|
-
predicate
|
65
|
-
attribute = splitted_key[0..-2].join('_')
|
66
|
-
"#{attribute}(#{predicate})"
|
63
|
+
attribute_name, predicate = Rao::Query::Operators.extract_attribute_name_and_predicate_from_name(key)
|
64
|
+
"#{attribute_name}(#{predicate})"
|
67
65
|
end
|
68
66
|
end
|
69
67
|
end
|
@@ -2,7 +2,7 @@ module Rao
|
|
2
2
|
module Query
|
3
3
|
class FormBuilder < SimpleForm::FormBuilder
|
4
4
|
def boolean(name, options = {})
|
5
|
-
translated_label = translate_label_for_boolean(name)
|
5
|
+
translated_label = translate_label_for_boolean(name, options.delete(:association))
|
6
6
|
options.reverse_merge!(collection: [[I18n.t("rao.query.form_builder.yes"), 1], [I18n.t("rao.query.form_builder.no"), 0]], include_blank: true, label: translated_label)
|
7
7
|
input name, options
|
8
8
|
end
|
@@ -32,9 +32,7 @@ module Rao
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def translate_label(name, association = nil)
|
35
|
-
|
36
|
-
attribute_name = splitted_name[0..-2].join('_')
|
37
|
-
predicate = splitted_name.last
|
35
|
+
attribute_name, predicate = extract_attribute_name_and_predicate_from_name(name)
|
38
36
|
translated_attribute_name = if association.nil?
|
39
37
|
klass_name = object.original_model_class_name
|
40
38
|
klass_name.constantize.human_attribute_name(attribute_name)
|
@@ -46,10 +44,8 @@ module Rao
|
|
46
44
|
I18n.t("rao.query.form_builder.predicates.#{predicate}", attribute_name: translated_attribute_name)
|
47
45
|
end
|
48
46
|
|
49
|
-
def translate_label_for_boolean(name)
|
50
|
-
|
51
|
-
attribute_name = splitted_name[0..-2].join('_')
|
52
|
-
predicate = splitted_name.last
|
47
|
+
def translate_label_for_boolean(name, association = nil)
|
48
|
+
attribute_name, predicate = extract_attribute_name_and_predicate_from_name(name)
|
53
49
|
if association.nil?
|
54
50
|
klass_name = object.original_model_class_name
|
55
51
|
else
|
@@ -58,6 +54,10 @@ module Rao
|
|
58
54
|
translated_attribute_name = klass_name.constantize.human_attribute_name(attribute_name)
|
59
55
|
I18n.t("rao.query.form_builder.boolean_label", attribute_name: translated_attribute_name)
|
60
56
|
end
|
57
|
+
|
58
|
+
def extract_attribute_name_and_predicate_from_name(name)
|
59
|
+
Rao::Query::Operators.extract_attribute_name_and_predicate_from_name(name)
|
60
|
+
end
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -1,18 +1,6 @@
|
|
1
1
|
module Rao
|
2
2
|
module Query
|
3
3
|
class ConditionParser
|
4
|
-
OPERATOR_MAP = {
|
5
|
-
gt: :>,
|
6
|
-
gt_or_eq: :>=,
|
7
|
-
eq: :'=',
|
8
|
-
not_eq: :'<>',
|
9
|
-
lt_or_eq: :<=,
|
10
|
-
lt: :<,
|
11
|
-
null: :is_null,
|
12
|
-
not_null: :is_not_null,
|
13
|
-
cont: :like
|
14
|
-
}
|
15
|
-
|
16
4
|
def initialize(scope, field, condition)
|
17
5
|
@scope, @field, @condition = scope, field, condition
|
18
6
|
end
|
@@ -26,18 +14,12 @@ module Rao
|
|
26
14
|
def build_condition_statement(parent_key, condition, nested = false)
|
27
15
|
if is_a_condition?(parent_key) && !nested
|
28
16
|
table, column, operator = extract_table_column_and_operator(parent_key)
|
29
|
-
return handle_null_condition(column, operator) if is_null_operator?(operator)
|
30
|
-
# binding.pry
|
17
|
+
return handle_null_condition(column, operator, condition) if is_null_operator?(operator)
|
31
18
|
if operator == 'cont'
|
32
19
|
return ["#{table}.#{column} LIKE ?", "%#{normalized_condition(table, column, condition)}%"]
|
33
20
|
else
|
34
21
|
return ["#{table}.#{column} = ?", normalized_condition(table, column, condition)]
|
35
22
|
end
|
36
|
-
# if column_is_boolean?(column)
|
37
|
-
# ["#{column} = ?", to_boolean(condition)]
|
38
|
-
# else
|
39
|
-
# ["#{column} = ?", condition]
|
40
|
-
# end
|
41
23
|
else
|
42
24
|
if nested
|
43
25
|
column = extract_column(parent_key)
|
@@ -52,11 +34,18 @@ module Rao
|
|
52
34
|
%w(null not_null).include?(operator)
|
53
35
|
end
|
54
36
|
|
55
|
-
|
56
|
-
|
57
|
-
|
37
|
+
# We build the condition for booleans here.
|
38
|
+
#
|
39
|
+
# | operator | condition | result |
|
40
|
+
# | 'null' | true | 'IS NULL' |
|
41
|
+
# | 'null' | false | 'IS NOT NULL' |
|
42
|
+
# | 'not_null' | true | 'IS NOT NULL' |
|
43
|
+
# | 'not_null' | false | 'IS NULL' |
|
44
|
+
#
|
45
|
+
def handle_null_condition(column, operator, condition)
|
46
|
+
if (operator == "null" && to_boolean(condition) == true) || (operator == "not_null" && to_boolean(condition) == false)
|
58
47
|
"#{column} IS NULL"
|
59
|
-
|
48
|
+
else
|
60
49
|
"#{column} IS NOT NULL"
|
61
50
|
end
|
62
51
|
end
|
@@ -98,7 +87,7 @@ module Rao
|
|
98
87
|
end
|
99
88
|
|
100
89
|
def operator_map
|
101
|
-
|
90
|
+
Rao::Query::Operators::MAP
|
102
91
|
end
|
103
92
|
|
104
93
|
def column_is_boolean?(table_name, column_name)
|
@@ -126,7 +115,7 @@ module Rao
|
|
126
115
|
end
|
127
116
|
|
128
117
|
def to_boolean(string)
|
129
|
-
|
118
|
+
case
|
130
119
|
when Rails.version < '4.2'
|
131
120
|
::ActiveRecord::ConnectionAdapters::Column.value_to_boolean(string)
|
132
121
|
when Rails.version < '5.0'
|
@@ -134,7 +123,6 @@ module Rao
|
|
134
123
|
else
|
135
124
|
::ActiveRecord::Type::Boolean.new.cast(string)
|
136
125
|
end
|
137
|
-
result.gsub('"', '')
|
138
126
|
end
|
139
127
|
|
140
128
|
def normalized_condition(table, column, condition)
|
data/config/locales/de.yml
CHANGED
@@ -2,8 +2,13 @@ de:
|
|
2
2
|
rao:
|
3
3
|
query:
|
4
4
|
form_builder:
|
5
|
+
boolean_label: "%{attribute_name}?"
|
5
6
|
predicates:
|
6
7
|
cont: "%{attribute_name} enthält"
|
7
8
|
eq: "%{attribute_name} ist"
|
9
|
+
'null': "%{attribute_name} ist leer"
|
10
|
+
not_null: "%{attribute_name} ist nicht leer"
|
8
11
|
reset: "Zurücksetzen"
|
9
|
-
submit: "Suchen"
|
12
|
+
submit: "Suchen"
|
13
|
+
'yes': Ja
|
14
|
+
'no': nein
|
data/config/locales/en.yml
CHANGED
@@ -2,8 +2,13 @@ en:
|
|
2
2
|
rao:
|
3
3
|
query:
|
4
4
|
form_builder:
|
5
|
+
boolean_label: "%{attribute_name}?"
|
5
6
|
predicates:
|
6
7
|
cont: "%{attribute_name} contains"
|
7
8
|
eq: "%{attribute_name} equals"
|
9
|
+
'null': "%{attribute_name} is present"
|
10
|
+
not_null: "%{attribute_name} is not present"
|
8
11
|
reset: "Reset"
|
9
|
-
submit: "Search"
|
12
|
+
submit: "Search"
|
13
|
+
'yes': "Yes"
|
14
|
+
'no': "No"
|
data/lib/rao/query.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Rao
|
2
|
+
module Query
|
3
|
+
module Operators
|
4
|
+
# The not operators have to go first. Else the matching will detect _null
|
5
|
+
# or _eq before _not_null and _not_eq.
|
6
|
+
MAP = {
|
7
|
+
not_eq: :'<>',
|
8
|
+
not_null: :is_not_null,
|
9
|
+
|
10
|
+
gt: :>,
|
11
|
+
gt_or_eq: :>=,
|
12
|
+
eq: :'=',
|
13
|
+
lt_or_eq: :<=,
|
14
|
+
lt: :<,
|
15
|
+
null: :is_null,
|
16
|
+
cont: :like
|
17
|
+
}
|
18
|
+
|
19
|
+
def self.extract_attribute_name_and_predicate_from_name(name)
|
20
|
+
MAP.keys.each do |predicate|
|
21
|
+
if name.to_s.end_with?(predicate.to_s)
|
22
|
+
attribute_name = name[0..-(predicate.length + 2)]
|
23
|
+
return attribute_name, predicate
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
raise "Could not extract attribute name and predicate from #{name}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rao-query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.33.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roberto Vasquez Angel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -122,6 +122,62 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry-coolline
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rails-dummy
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: bootsnap
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: factory_bot_rails
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
125
181
|
description:
|
126
182
|
email:
|
127
183
|
- roberto@vasquez-angel.de
|
@@ -145,6 +201,7 @@ files:
|
|
145
201
|
- lib/rao/query.rb
|
146
202
|
- lib/rao/query/configuration.rb
|
147
203
|
- lib/rao/query/engine.rb
|
204
|
+
- lib/rao/query/operators.rb
|
148
205
|
- lib/rao/query/version.rb
|
149
206
|
homepage: https://github.com/rao
|
150
207
|
licenses:
|