like_query 0.0.6 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +160 -48
- data/lib/like_query/collect.rb +146 -93
- data/lib/like_query/model_extensions.rb +24 -21
- data/lib/like_query/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: c46b541528f87a7bd078c47eaa7bc264503ff6b1c333af0caf18aacb2beea24c
|
4
|
+
data.tar.gz: 8d5d867c0707f5cfe827a4d55082434d5e02bec45528f04737a8927746388fcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aaf145febd6f66ee1549dd8d2d5b5285d1c191f6e5759519ec5053eb88a6055c087411ab3d4962afb282d3c208f439f9a7fad5f852797a3466e93c22238f6aba
|
7
|
+
data.tar.gz: 7097e44705ad35add8233002e3db0e0b20330525197a3dcc4d15070e43d38f03221c3f2e9902e8677ee6e273e68e6eaf4490d6bc825ce82fdce2722d0301dd2d
|
data/README.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# like_query
|
2
2
|
|
3
|
-
For my
|
3
|
+
For my clients' newly built applications with Turbo, search queries mostly serve two purposes:
|
4
4
|
|
5
|
-
Index view callable by a url like `/customers?find=müller screw`
|
5
|
+
- Index view callable by a url like `/customers?find=müller screw`
|
6
|
+
- javascript component / dropdown on the front, in our case built with svelte, which receives a json and renders a table in a dropdown.
|
6
7
|
|
7
|
-
This query generator is built for
|
8
|
+
This query generator is built for these two purposes
|
9
|
+
|
10
|
+
Modules like one of the svelte components mentioned above have a total response time (from pressing a key until the result is rendered) of about 60 msec, while with turbo the same time is mostly around 140-160 msec. The gem itself, from querying the database to producing a hash, has a time of about 3 msec. These results are for small data sets (e.g. 30 records found).
|
8
11
|
|
9
12
|
## Installation
|
10
13
|
|
@@ -14,18 +17,28 @@ add
|
|
14
17
|
|
15
18
|
to Gemfile
|
16
19
|
|
17
|
-
this adds the methods `#like` and `#
|
20
|
+
this adds the methods `#like` and `#generate_hash` to all models.
|
21
|
+
|
22
|
+
**Config**
|
23
|
+
|
24
|
+
You can set a default limit by
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
config.x.like_query.limit = 20
|
28
|
+
```
|
29
|
+
|
30
|
+
This can be overriden by calling the methods
|
18
31
|
|
19
32
|
## Usage
|
20
33
|
|
21
|
-
|
34
|
+
**#like**
|
22
35
|
|
23
36
|
```ruby
|
24
37
|
customer = Customer.create(name: 'Ambühl')
|
25
|
-
|
38
|
+
Article.create(name: 'first', number: '01', customer: customer)
|
26
39
|
|
27
40
|
Article.like('fir', :name, :number)
|
28
|
-
# =>
|
41
|
+
# => <Article:0x00000001067107a8 id: ...>
|
29
42
|
# => searches by: "where name like '%fir%' or number like '%fir%'"
|
30
43
|
# => queries are built with Article.arel_table[:name].matches('%fir%')
|
31
44
|
|
@@ -35,75 +48,174 @@ Article.like(['fir', 'ambühl'], :name, :number, customer: :name)
|
|
35
48
|
# => would also find art1
|
36
49
|
```
|
37
50
|
|
38
|
-
|
39
|
-
|
40
|
-
returns a hash that can easily be transformed by `#to_json` for a javascript-frontend, by example
|
51
|
+
**#generate_hash**
|
41
52
|
|
42
|
-
can
|
53
|
+
returns a hash that can easily be transformed by `#to_json` for a javascript frontend, for example
|
43
54
|
|
44
55
|
```ruby
|
45
56
|
customer = Customer.create(name: 'Ambühl')
|
46
57
|
art1 = Article.create(name: 'first', number: '01', customer: customer)
|
47
58
|
|
48
|
-
Article.like('fir', :name).
|
59
|
+
Article.like('fir', :name).generate_hash(limit: 10)
|
49
60
|
# returns:
|
50
|
-
{
|
51
|
-
:
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
{
|
62
|
+
data:
|
63
|
+
[
|
64
|
+
{
|
65
|
+
values: ["Müller"],
|
66
|
+
attributes: {"customer.name": "Müller"},
|
67
|
+
id: 1,
|
68
|
+
model: "Article"
|
69
|
+
},
|
70
|
+
...
|
71
|
+
],
|
72
|
+
length: 4,
|
73
|
+
overflow: true,
|
74
|
+
columns_count: 2,
|
75
|
+
sub_records_columns_count: 0,
|
76
|
+
image: false,
|
77
|
+
time: 18.282996
|
59
78
|
}
|
60
79
|
|
61
|
-
Article.like('fir', :name).
|
80
|
+
Article.like('fir', :name).generate_hash(:number, limit: 10)
|
62
81
|
# would query like the above example: Search scope is only :name
|
63
82
|
# but would return article-number instead of article-name inside the data block
|
64
83
|
```
|
65
84
|
|
66
|
-
`#
|
85
|
+
`#generate_hash` uses `LikeQuery::Collect`, functionality is the same.
|
67
86
|
|
68
|
-
**Class LikeQuery::Collect**
|
87
|
+
**Class LikeQuery::Collect**
|
69
88
|
|
70
89
|
```ruby
|
71
|
-
cust = Customer.create(name: '
|
72
|
-
|
90
|
+
cust = Customer.create(name: 'cust')
|
91
|
+
Article.create(name: 'screw', customer: cust)
|
73
92
|
|
74
93
|
c = LikeQuery::Collect.new(4)
|
75
94
|
# => 4 is the limit
|
76
95
|
|
77
|
-
c.
|
78
|
-
|
79
|
-
|
80
|
-
c.receive { Customer.like('any-art', :name, image: :image_column, articles: :name) }
|
81
|
-
# => limit is already exhausted: does nothing
|
82
|
-
# => otherwise it would add Customers to the result hash
|
83
|
-
|
96
|
+
c.set_schema(Customer, :name)
|
97
|
+
c.collect(parent: :customer) { Article.like('screw', :name) }
|
98
|
+
c.generate_json
|
84
99
|
c.result
|
85
|
-
|
100
|
+
|
101
|
+
# =>
|
86
102
|
{
|
87
|
-
:
|
88
|
-
{
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
103
|
+
"data": [
|
104
|
+
{
|
105
|
+
"values": [
|
106
|
+
"cust"
|
107
|
+
],
|
108
|
+
"attributes": {
|
109
|
+
"name": "cust"
|
110
|
+
},
|
111
|
+
"id": 1,
|
112
|
+
"model": "Customer",
|
113
|
+
"children": [
|
114
|
+
{
|
115
|
+
"values": [
|
116
|
+
"screw"
|
117
|
+
],
|
118
|
+
"attributes": {
|
119
|
+
"name": "screw"
|
120
|
+
},
|
121
|
+
"id": 1,
|
122
|
+
"model": "Customer.Article",
|
123
|
+
"parent_id": 1,
|
124
|
+
}
|
125
|
+
]
|
95
126
|
}
|
96
|
-
],
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
100
|
-
:
|
127
|
+
],
|
128
|
+
"length": 2,
|
129
|
+
"overflow": false,
|
130
|
+
"columns_count": 1,
|
131
|
+
"sub_records_columns_count": 0,
|
132
|
+
"image": false,
|
133
|
+
"time": 0.0075
|
134
|
+
}
|
135
|
+
```
|
136
|
+
|
137
|
+
**query schema and result_schema**
|
138
|
+
|
139
|
+
The resulting hash for a record looks like this:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
{
|
143
|
+
:values => ["abc", "123"],
|
144
|
+
:id => 456,
|
145
|
+
:model => "article",
|
146
|
+
:image => "src:img..."
|
147
|
+
}
|
148
|
+
```
|
149
|
+
|
150
|
+
The resulting hash or json is built from the schema, which can look like this:
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
:number
|
154
|
+
```
|
155
|
+
|
156
|
+
or
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
[:number, :name]
|
160
|
+
```
|
161
|
+
|
162
|
+
or
|
163
|
+
|
164
|
+
```ruby
|
165
|
+
{
|
166
|
+
values: [:number, :name],
|
167
|
+
image: :name_of_a_column_or_method
|
101
168
|
}
|
102
169
|
```
|
103
170
|
|
171
|
+
There is a query schema and an output schema.
|
172
|
+
If no output schema is defined, the query schema is used for both.
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
Article.like('first', :name).generate_hash
|
176
|
+
# => :values => ["first"]
|
177
|
+
```
|
178
|
+
|
179
|
+
If an output schema is specified, the result may differ from the search scope:
|
180
|
+
|
181
|
+
```ruby
|
182
|
+
Article.like('first', :name).generate_hash(:number, :name)
|
183
|
+
# => :values => ["012", "first"]
|
184
|
+
```
|
185
|
+
|
186
|
+
The collect class remembers the schema for a model:
|
187
|
+
|
188
|
+
```ruby
|
189
|
+
c = LikeQuery::Collect.new
|
190
|
+
c.collect([:name]) { Article.like('x') }
|
191
|
+
c.collect { Article.like('x') } #=> schema [:name] is used
|
192
|
+
c.collect { Article.like('x', :number) } # => schema [:number] is used
|
193
|
+
```
|
194
|
+
|
195
|
+
**#set_schema**
|
196
|
+
|
197
|
+
When a child returns its parent, the schema for the parent must be given.
|
198
|
+
Otherwise `#generate_hash` would not know what values to return.
|
199
|
+
|
200
|
+
```ruby
|
201
|
+
c = LikeQuery::Collect.new
|
202
|
+
c.set_schema(Customer, :name)
|
203
|
+
# => now the customer will be returned with { values: [<name>] }
|
204
|
+
c.collect(parent: :customer) { Article.like('screw', :name) }
|
205
|
+
# => this will add the customer (unless it exists in the list) and add the Article as a child to the customer
|
206
|
+
r = c.generate_hash
|
207
|
+
```
|
208
|
+
|
209
|
+
**Performance**
|
210
|
+
|
211
|
+
Values defined by the schema are processed by the `#send` method, but recursively.
|
212
|
+
This means, for example, that for an `article` with the given key `customer.employees.contact_details.email` in the schema would return the name of the associated customer.
|
213
|
+
|
214
|
+
ATTENTION: This can trigger a lot of database queries, depending on your structure or if or which method is behind the called names.
|
215
|
+
|
104
216
|
## Tests
|
105
217
|
|
106
|
-
Tests for this gem, by rspec, are included
|
218
|
+
Tests for this gem, by rspec, are not included in this gem, they can be found in [test project](https://gitlab.com/sedl/like_query_project)
|
107
219
|
|
108
220
|
- [ ] [Set up project integrations](https://gitlab.com/sedl/like_query/-/settings/integrations)
|
109
221
|
|
data/lib/like_query/collect.rb
CHANGED
@@ -1,116 +1,86 @@
|
|
1
1
|
module LikeQuery
|
2
2
|
class Collect
|
3
|
-
def initialize(limit =
|
4
|
-
|
3
|
+
def initialize(limit = nil)
|
4
|
+
if limit
|
5
|
+
@limit = limit
|
6
|
+
elsif Rails.configuration.x.like_query.limit
|
7
|
+
@limit = Rails.configuration.x.like_query.limit
|
8
|
+
else
|
9
|
+
@limit = nil
|
10
|
+
end
|
5
11
|
@length = 0
|
6
|
-
@data =
|
12
|
+
@data = {}
|
7
13
|
@overflow = false
|
8
14
|
@columns_count = 0
|
9
15
|
@sub_records_columns_count = 0
|
10
16
|
@image = false
|
11
|
-
|
17
|
+
#@sub_records_image = false
|
18
|
+
@start_time = Time.now
|
19
|
+
@schemes = {}
|
20
|
+
@images = {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_schema(model, schema)
|
24
|
+
@schemes[model.to_s] = schema_to_hash(schema)
|
12
25
|
end
|
13
26
|
|
14
|
-
def
|
27
|
+
def collect(output_schema = nil, limit: nil, parent: nil, image: nil, &block)
|
15
28
|
|
16
|
-
|
29
|
+
_limit = (limit ? (@limit && @limit < limit ? @limit : limit) : @limit)
|
30
|
+
return false if @length >= _limit
|
17
31
|
length = 0
|
18
|
-
@image = image.present?
|
19
32
|
|
20
|
-
recs = yield
|
33
|
+
recs = yield.includes(parent).limit(_limit)
|
21
34
|
|
22
|
-
|
23
|
-
if
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
35
|
+
scm = (output_schema.present? ? output_schema : recs.like_query_schema)
|
36
|
+
if scm.present?
|
37
|
+
@schemes[recs.klass.to_s] = schema_to_hash(scm)
|
38
|
+
end
|
39
|
+
model_name = recs.klass.to_s
|
40
|
+
schema = @schemes[model_name] || schema_to_hash(nil)
|
41
|
+
_img = image || schema[:image]
|
42
|
+
if _img.present?
|
43
|
+
@images[model_name] = _img
|
44
|
+
@image = true
|
28
45
|
end
|
29
46
|
|
30
|
-
|
31
|
-
|
32
|
-
if
|
33
|
-
|
47
|
+
if parent
|
48
|
+
parent_assoc = recs.klass.reflect_on_association(parent)
|
49
|
+
if !parent_assoc
|
50
|
+
raise "parent «#{parent}» is not a valid association"
|
34
51
|
end
|
35
52
|
end
|
36
53
|
|
37
|
-
recs.
|
38
|
-
rec_attr = {}
|
39
|
-
pattern.each do |p|
|
40
|
-
if p.is_a?(Hash)
|
54
|
+
recs.each do |rec|
|
41
55
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# raise 'Missing input: image column for given key :image' unless cols.present?
|
47
|
-
#
|
48
|
-
# # IMAGE COLUMN
|
49
|
-
#
|
50
|
-
# rec_attr[:image] = get_column_value(r, cols)
|
51
|
-
# @image = true
|
52
|
-
|
53
|
-
else
|
56
|
+
if @length >= _limit
|
57
|
+
@overflow = true
|
58
|
+
break
|
59
|
+
else
|
54
60
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
[cols]
|
67
|
-
end
|
68
|
-
|
69
|
-
(sub_records.is_a?(Enumerable) ? sub_records : [sub_records]).each do |sub_record|
|
70
|
-
sub_attr = []
|
71
|
-
_cols.each do |c|
|
72
|
-
sub_attr.push(get_column_value(sub_record, c))
|
73
|
-
end
|
74
|
-
|
75
|
-
if @length >= @limit || (limit && length >= limit)
|
76
|
-
@overflow = true
|
77
|
-
break
|
78
|
-
else
|
79
|
-
c = sub_attr.length
|
80
|
-
@sub_records_columns_count = c if c > @sub_records_columns_count
|
81
|
-
rec_attr[:associations] ||= {}
|
82
|
-
rec_attr[:associations][assoc] ||= []
|
83
|
-
sub_hash = { values: sub_attr, id: sub_record.id, model: sub_record.class.to_s.underscore }
|
84
|
-
if image_column
|
85
|
-
sub_hash[:image] = get_column_value(sub_record, image_column)
|
86
|
-
@sub_records_image = true
|
87
|
-
end
|
88
|
-
rec_attr[:associations][assoc].push(sub_hash)
|
89
|
-
@length += 1
|
90
|
-
length += 1
|
91
|
-
end
|
92
|
-
end
|
61
|
+
if parent
|
62
|
+
parent_record = rec.send(parent)
|
63
|
+
r = record_to_hash(rec, schema, image, parent_record)
|
64
|
+
parent_class_name = parent_record.class.to_s
|
65
|
+
parent_key = "#{parent_class_name}#{parent_record.id}"
|
66
|
+
|
67
|
+
unless @data[parent_key]
|
68
|
+
parent_schema = @schemes[parent_class_name]
|
69
|
+
unless parent_schema
|
70
|
+
Rails.logger.debug("WARNING: NO SCHEMA GIVEN FOR «#{parent_class_name}»")
|
71
|
+
parent_schema = schema_to_hash(nil)
|
93
72
|
end
|
73
|
+
@data[parent_key] = record_to_hash(parent_record, parent_schema, @images[parent_class_name])
|
74
|
+
@length += 1
|
94
75
|
end
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
rec_attr[:values].push(get_column_value(r, p))
|
101
|
-
rec_attr[:id] = r.id
|
102
|
-
rec_attr[:model] = r.class.to_s.underscore
|
103
|
-
rec_attr[:image] = r.send(image) if @image
|
104
|
-
|
76
|
+
@data[parent_key][:children] ||= []
|
77
|
+
@data[parent_key][:children].push(r)
|
78
|
+
else
|
79
|
+
r = record_to_hash(rec, schema, image)
|
80
|
+
@data["#{rec.class}#{rec.id}"] = r
|
105
81
|
end
|
106
|
-
|
107
|
-
if @length >= @limit || (limit && length >= limit)
|
108
|
-
@overflow = true
|
109
|
-
break
|
110
|
-
else
|
111
|
-
c = (image ? 1 : 0) + rec_attr[:values].length
|
82
|
+
c = (@image ? 1 : 0) + r[:values].to_a.length
|
112
83
|
@columns_count = c if c > @columns_count
|
113
|
-
@data.push(rec_attr)
|
114
84
|
@length += 1
|
115
85
|
length += 1
|
116
86
|
end
|
@@ -119,23 +89,106 @@ module LikeQuery
|
|
119
89
|
true
|
120
90
|
end
|
121
91
|
|
122
|
-
def
|
92
|
+
def generate_hash
|
93
|
+
data = @data.map { |_, v| v }
|
123
94
|
{
|
124
|
-
data:
|
95
|
+
data: data,
|
125
96
|
length: @length,
|
126
97
|
overflow: @overflow,
|
127
98
|
columns_count: @columns_count,
|
128
99
|
sub_records_columns_count: @sub_records_columns_count,
|
129
100
|
image: @image,
|
130
|
-
sub_records_image: @sub_records_image
|
101
|
+
# sub_records_image: @sub_records_image,
|
102
|
+
time: Time.now - @start_time
|
131
103
|
}
|
132
104
|
end
|
133
105
|
|
106
|
+
def generate_json
|
107
|
+
generate_hash.to_json
|
108
|
+
end
|
109
|
+
|
134
110
|
private
|
135
111
|
|
112
|
+
def record_to_hash(record, schema, image, parent = nil)
|
113
|
+
r = {}
|
114
|
+
schema[:values].each do |k|
|
115
|
+
v = get_column_value(record, k)
|
116
|
+
r[:values] ||= []
|
117
|
+
r[:values].push(v)
|
118
|
+
r[:attributes] ||= {}
|
119
|
+
r[:attributes][k] = v
|
120
|
+
end
|
121
|
+
r[:id] = record.id
|
122
|
+
if parent
|
123
|
+
r[:model] = "#{parent.class.to_s}.#{record.class}"
|
124
|
+
r[:parent_id] = parent.id
|
125
|
+
else
|
126
|
+
r[:model] = record.class.to_s
|
127
|
+
end
|
128
|
+
r[:image] = record.send(image) if image
|
129
|
+
r
|
130
|
+
end
|
131
|
+
|
132
|
+
def schema_to_hash(schema)
|
133
|
+
|
134
|
+
if schema.is_a?(Array) && schema.first.is_a?(Array)
|
135
|
+
_schema = schema.first
|
136
|
+
raise 'invalid schema format' if schema.length >= 2
|
137
|
+
else
|
138
|
+
_schema = schema
|
139
|
+
end
|
140
|
+
|
141
|
+
if _schema.is_a?(String) || _schema.is_a?(Symbol)
|
142
|
+
{ values: [_schema.to_sym] }
|
143
|
+
elsif _schema.is_a?(Array)
|
144
|
+
r = {}
|
145
|
+
_schema.each do |s|
|
146
|
+
if s.is_a?(String) || s.is_a?(Symbol)
|
147
|
+
r[:values] ||= []
|
148
|
+
r[:values].push(s.to_sym)
|
149
|
+
elsif s.is_a?(Hash)
|
150
|
+
s.each do |k, v|
|
151
|
+
if k.to_sym == :image
|
152
|
+
r[:image] = v
|
153
|
+
end
|
154
|
+
end
|
155
|
+
else
|
156
|
+
raise "invalid schema format (#{s}) in schema => «#{schema}»"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
r
|
160
|
+
elsif _schema.is_a?(Hash)
|
161
|
+
_schema
|
162
|
+
elsif !schema.present?
|
163
|
+
{ values: [] }
|
164
|
+
else
|
165
|
+
raise "invalid schema format => «#{schema}»"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
136
169
|
def get_column_value(record, column)
|
137
170
|
val = nil
|
138
|
-
column.
|
171
|
+
if column.is_a?(Hash)
|
172
|
+
r = []
|
173
|
+
column.each do |k, v|
|
174
|
+
if v.is_a?(Array)
|
175
|
+
v.each do |_v|
|
176
|
+
if _v.is_a?(String) || _v.is_a?(Symbol)
|
177
|
+
r.push(get_column_value(record, "#{k}.#{_v}"))
|
178
|
+
else
|
179
|
+
raise "Too deeply nested objects: #{v}"
|
180
|
+
end
|
181
|
+
end
|
182
|
+
elsif v.is_a?(String) || v.is_a?(Symbol)
|
183
|
+
r.push(get_column_value(record, "#{k}.#{v}"))
|
184
|
+
else
|
185
|
+
raise "query column value can only be done by string or symbol, but given: #{v}"
|
186
|
+
end
|
187
|
+
end
|
188
|
+
val = r.join(', ')
|
189
|
+
else
|
190
|
+
column.to_s.split('.').each { |i| val = (val ? val : record).send(i) }
|
191
|
+
end
|
139
192
|
(val ? val : '')
|
140
193
|
end
|
141
194
|
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module LikeQuery
|
2
2
|
module ModelExtensions
|
3
3
|
|
4
|
-
def like(search_string, *
|
4
|
+
def like(search_string, *schema)
|
5
5
|
|
6
6
|
raise 'like can only be called from a model' if self == ApplicationRecord
|
7
7
|
|
8
8
|
queries = nil
|
9
9
|
associations = []
|
10
|
-
@
|
10
|
+
@like_query_schema = schema
|
11
11
|
|
12
12
|
(search_string.is_a?(String) ? search_string.split(' ') : search_string).each do |s|
|
13
13
|
str = "%#{s}%"
|
14
14
|
q = nil
|
15
|
-
if
|
16
|
-
raise "only one array can be given: Either
|
15
|
+
if schema.first.is_a?(Array) && schema.length >= 2
|
16
|
+
raise "only one array can be given: Either schema as one array or as multiple args, not as array"
|
17
17
|
end
|
18
|
-
(
|
18
|
+
(schema.first.is_a?(Array) ? schema.first : schema).each do |p|
|
19
19
|
if p.is_a?(Symbol) || p.is_a?(String)
|
20
20
|
_q = arel_table[p].matches(str)
|
21
21
|
q = (q ? q.or(_q) : _q)
|
@@ -42,28 +42,31 @@ module LikeQuery
|
|
42
42
|
queries = (queries ? queries.and(q) : q)
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
if associations.present?
|
46
|
+
left_outer_joins(associations).where(
|
47
|
+
queries
|
48
|
+
)
|
49
|
+
else
|
50
|
+
where(
|
51
|
+
queries
|
52
|
+
)
|
53
|
+
end
|
54
54
|
end
|
55
55
|
|
56
|
-
def
|
57
|
-
|
56
|
+
def generate_hash(output_schema = nil, limit: 50, image: nil)
|
57
|
+
c = LikeQuery::Collect.new(limit)
|
58
|
+
c.collect(output_schema, limit: limit, image: image) { all }
|
59
|
+
c.generate_hash
|
60
|
+
end
|
58
61
|
|
59
|
-
|
62
|
+
def generate_json(output_schema = nil, limit: 50, image: nil)
|
60
63
|
c = LikeQuery::Collect.new(limit)
|
61
|
-
c.
|
62
|
-
c.
|
64
|
+
c.collect(output_schema, limit: limit, image: image) { all }
|
65
|
+
c.generate_json
|
63
66
|
end
|
64
67
|
|
65
|
-
def
|
66
|
-
@
|
68
|
+
def like_query_schema
|
69
|
+
@like_query_schema
|
67
70
|
end
|
68
71
|
|
69
72
|
end
|
data/lib/like_query/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: like_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- christian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|