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