query_helper 0.2.7 → 0.2.8
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 +1 -1
- data/README.md +27 -0
- data/lib/query_helper.rb +39 -4
- data/lib/query_helper/query_helper_concern.rb +1 -0
- data/lib/query_helper/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c63157141a68e8dafa45c307f5be2c90cc88fdea8b4c4777c4f81f89a58e797
|
4
|
+
data.tar.gz: 720e0093ccddebf935977aa8180127c99b2bbcd232f343ba75684c32c38d7686
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d49fc27361319b65c9b03d07b387561baf0341f3783166b41f51b30166b6a381d8ef2ccdc7dab141fd7db58bf16f68850a6ed6692ad9f055eff6304fce52acb
|
7
|
+
data.tar.gz: 87f9578aad0578a016aa573493adf486aeb9793506522685e1d6c388c028e85483d97a29d420f9257d81a4c3fd33577ffb6b76e331c626eaf1f7b22b717a6c99
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -111,6 +111,33 @@ null | is null *or* is not null
|
|
111
111
|
|
112
112
|
Note: For the null operator code, toggle *is null* operator with true and *is not null* operator with false
|
113
113
|
|
114
|
+
#### Search
|
115
|
+
|
116
|
+
QueryHelper supports searching across multiple fields. To implement pass an array of column aliases into the `search_fields` argument when creating or updating a `QueryHelper` object.
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
@query_helper.update(search_fields: ["column1", "column2"])
|
120
|
+
render json: @query_helper.results()
|
121
|
+
```
|
122
|
+
|
123
|
+
You can then take advantage of the `search_for` url param to do text matching in any of the columns included
|
124
|
+
|
125
|
+
Request: `http://www.example.com/resources?search_for=foo`
|
126
|
+
|
127
|
+
Results:
|
128
|
+
```json
|
129
|
+
[
|
130
|
+
{
|
131
|
+
"column1": "foobar",
|
132
|
+
"column2": "bar"
|
133
|
+
},
|
134
|
+
{
|
135
|
+
"column1": "bar",
|
136
|
+
"column2": "barfoo"
|
137
|
+
}
|
138
|
+
]
|
139
|
+
```
|
140
|
+
|
114
141
|
#### Associations
|
115
142
|
|
116
143
|
Include ActiveRecord associations in the payload. The association must be defined in the model.
|
data/lib/query_helper.rb
CHANGED
@@ -29,7 +29,9 @@ class QueryHelper
|
|
29
29
|
as_json_options: nil, # a list of as_json options you'd like run before returning the payload
|
30
30
|
custom_mappings: {}, # custom keyword => sql_expression mappings
|
31
31
|
api_payload: false, # Return the paginated payload or simply return the result array
|
32
|
-
preload: [] # preload activerecord associations - used instead of `associations` when you don't want them included in the payload
|
32
|
+
preload: [], # preload activerecord associations - used instead of `associations` when you don't want them included in the payload
|
33
|
+
search_fields: [],
|
34
|
+
search_string: nil
|
33
35
|
)
|
34
36
|
@query = query.class < ActiveRecord::Relation ? query.to_sql : query
|
35
37
|
@model = query.class < ActiveRecord::Relation ? query.base_class : model
|
@@ -44,6 +46,8 @@ class QueryHelper
|
|
44
46
|
@custom_mappings = custom_mappings
|
45
47
|
@api_payload = api_payload
|
46
48
|
@preload = preload
|
49
|
+
@search_fields = search_fields
|
50
|
+
@search_string = search_string
|
47
51
|
|
48
52
|
if @page && @per_page
|
49
53
|
# Determine limit and offset
|
@@ -64,7 +68,8 @@ class QueryHelper
|
|
64
68
|
as_json_options: nil,
|
65
69
|
single_record: nil,
|
66
70
|
custom_mappings: nil,
|
67
|
-
preload: []
|
71
|
+
preload: [],
|
72
|
+
search_fields: nil
|
68
73
|
)
|
69
74
|
@query = query.class < ActiveRecord::Relation ? query.to_sql : query if query
|
70
75
|
@model = query.class < ActiveRecord::Relation ? query.base_class : model if model || query
|
@@ -75,6 +80,7 @@ class QueryHelper
|
|
75
80
|
@as_json_options = as_json_options if as_json_options
|
76
81
|
@custom_mappings = custom_mappings if custom_mappings
|
77
82
|
@preload = preload if preload
|
83
|
+
@search_fields = search_fields if search_fields
|
78
84
|
return self
|
79
85
|
end
|
80
86
|
|
@@ -102,14 +108,27 @@ class QueryHelper
|
|
102
108
|
# create the filters from the column maps
|
103
109
|
@sql_filter.create_filters()
|
104
110
|
|
111
|
+
having_clauses = @sql_filter.having_clauses
|
112
|
+
where_clauses = @sql_filter.where_clauses
|
113
|
+
|
114
|
+
if @search_string
|
115
|
+
search_filter = search_filter(column_maps)
|
116
|
+
if search_filter[:placement] == :where
|
117
|
+
where_clauses << search_filter[:filter]
|
118
|
+
else
|
119
|
+
having_clauses << search_filter[:filter]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
|
105
124
|
# merge the filter bind variables into the query bind variables
|
106
125
|
@bind_variables.merge!(@sql_filter.bind_variables)
|
107
126
|
|
108
127
|
# Execute Sql Query
|
109
128
|
manipulator = SqlManipulator.new(
|
110
129
|
sql: @query,
|
111
|
-
where_clauses:
|
112
|
-
having_clauses:
|
130
|
+
where_clauses: where_clauses,
|
131
|
+
having_clauses: having_clauses,
|
113
132
|
order_by_clauses: @sql_sort.parse_sort_string,
|
114
133
|
include_limit_clause: @page && @per_page ? true : false,
|
115
134
|
additional_select_clauses: @sql_sort.select_strings
|
@@ -230,4 +249,20 @@ class QueryHelper
|
|
230
249
|
model: @model
|
231
250
|
)
|
232
251
|
end
|
252
|
+
|
253
|
+
def search_filter(column_maps)
|
254
|
+
raise ArgumentError.new("search_fields not defined") unless @search_fields.length > 0
|
255
|
+
placement = :where
|
256
|
+
maps = column_maps.select do |cm|
|
257
|
+
placement = :having if cm.aggregate
|
258
|
+
@search_fields.include? cm.alias_name
|
259
|
+
end
|
260
|
+
bind_variable = ('a'..'z').to_a.shuffle[0,20].join.to_sym
|
261
|
+
@bind_variables[bind_variable] = "%#{@search_string}%"
|
262
|
+
filter = "#{maps.map{|m| "#{m.sql_expression}::varchar"}.join(" || ")} ilike :#{bind_variable}"
|
263
|
+
return {
|
264
|
+
filter: filter,
|
265
|
+
placement: placement
|
266
|
+
}
|
267
|
+
end
|
233
268
|
end
|
@@ -33,6 +33,7 @@ class QueryHelper
|
|
33
33
|
helpers[:sql_filter] = create_query_helper_filter() if params[:filter]
|
34
34
|
helpers[:sql_sort] = create_query_helper_sort() if params[:sort]
|
35
35
|
helpers[:associations] = create_query_helper_associations() if params[:include]
|
36
|
+
helpers[:search_string] = params[:search_for] if params[:search_for]
|
36
37
|
helpers
|
37
38
|
end
|
38
39
|
end
|
data/lib/query_helper/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: query_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan McDaniel
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|