queryko 1.1.4 → 1.2.0.beta
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/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/lib/queryko/able.rb +33 -0
- data/lib/queryko/after_attributes.rb +7 -23
- data/lib/queryko/feature.rb +28 -0
- data/lib/queryko/filterer.rb +11 -0
- data/lib/queryko/filters/after.rb +11 -0
- data/lib/queryko/filters/base.rb +22 -0
- data/lib/queryko/filters/before.rb +11 -0
- data/lib/queryko/filters/max.rb +11 -0
- data/lib/queryko/filters/min.rb +16 -0
- data/lib/queryko/filters/search.rb +28 -0
- data/lib/queryko/naming.rb +4 -0
- data/lib/queryko/query_object.rb +8 -6
- data/lib/queryko/range_attributes.rb +4 -28
- data/lib/queryko/searchables.rb +7 -19
- data/lib/queryko/version.rb +1 -1
- data/lib/queryko.rb +9 -0
- metadata +13 -5
- data/sandbox/users_query.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11e57021d0bfe6379466a379cb14975b281f328683dbe7a33acbda07524e9dec
|
4
|
+
data.tar.gz: 614d9a1789c273a5a7ca00896f343ae55e1d79e802973793feff7eb0b044c66a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9220fa20b26cf34c7e2db0ae2dc8a0db229d33cd970815f5d251f849be2661783c9c6400be27434fca0e40e0ea81e48348e7e2aacde16759c315cd39df9b63ee
|
7
|
+
data.tar.gz: a1f98bbc374decd1f572ddac4308c5a91faf5afca06a89e7f2716fb0efebe8d576aa9384d0de43ba75af2a24d3552d188ccb10c2e4a285a86a641901480c1110
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/lib/queryko/able.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Queryko
|
2
|
+
module Able
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
base.class_eval do
|
6
|
+
class_attribute :filters, default: {}, instance_writer: false
|
7
|
+
class_attribute :features, default: {}, instance_writer: false
|
8
|
+
class_attribute :fields, default: {}, instance_writer: false
|
9
|
+
self.filters = {}
|
10
|
+
self.features = {}
|
11
|
+
self.fields = {}
|
12
|
+
|
13
|
+
private
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def feature(feature_name, filter, options = {})
|
19
|
+
# returns the feature if it exists
|
20
|
+
feat = self.features[feature_name.to_sym] ||= Queryko::Feature.new feature_name, self
|
21
|
+
self.filters[filter] ||= Array.new
|
22
|
+
|
23
|
+
# creates a filter
|
24
|
+
filt = feat.create_filter filter, options
|
25
|
+
self.filters[filter].push(filt)
|
26
|
+
|
27
|
+
# appends new field
|
28
|
+
self.fields[filt.field.to_sym] ||= Array.new
|
29
|
+
self.fields[filt.field.to_sym].push(filt)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,31 +1,15 @@
|
|
1
1
|
module Queryko
|
2
2
|
module AfterAttributes
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class_attribute :after_attributes, default: [], instance_writer: false
|
7
|
-
self.after_attributes = []
|
8
|
-
|
9
|
-
private
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
7
|
+
module ClassMethods
|
8
|
+
def add_after_attributes(*args)
|
9
|
+
args.each do |arg|
|
10
|
+
feature arg.to_sym, :after, as: "after_#{arg}"
|
16
11
|
end
|
17
12
|
end
|
18
|
-
def filter_after attribute
|
19
|
-
self.relation = relation.where("#{defined_table_name}.#{attribute} > ?", params["after_#{attribute}".to_sym])
|
20
|
-
end
|
21
13
|
end
|
22
14
|
end
|
23
|
-
|
24
|
-
module ClassMethods
|
25
|
-
def add_after_attributes(*args)
|
26
|
-
self.after_attributes ||= []
|
27
|
-
self.after_attributes += args
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
15
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Queryko::Feature
|
2
|
+
attr_reader :name, :filters, :query_object
|
3
|
+
def initialize(name, query_object)
|
4
|
+
@name = name
|
5
|
+
@query_object = query_object
|
6
|
+
@filters = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_filter(filter_name, options = {})
|
10
|
+
self.filters[filter_name] << create_filter(name, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_filter(filter_name, options = {})
|
14
|
+
case filter_name
|
15
|
+
when :after
|
16
|
+
result = filters[:after] ||= Queryko::Filters::After.new(options, self)
|
17
|
+
when :before
|
18
|
+
result = filters[:before] ||= Queryko::Filters::Before.new(options, self)
|
19
|
+
when :min
|
20
|
+
result = filters[:min] ||= Queryko::Filters::Min.new(options, self)
|
21
|
+
when :max
|
22
|
+
result = filters[:max] ||= Queryko::Filters::Max.new(options, self)
|
23
|
+
when :search
|
24
|
+
result = filters[:search] ||= Queryko::Filters::Search.new(options, self)
|
25
|
+
end
|
26
|
+
result
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "queryko/filters/base"
|
2
|
+
|
3
|
+
class Queryko::Filters::After < Queryko::Filters::Base
|
4
|
+
def intialize(options = {}, feature)
|
5
|
+
super options, feature
|
6
|
+
end
|
7
|
+
|
8
|
+
def perform(collection, token)
|
9
|
+
collection.where("\"#{table_name}\".\"#{column_name}\" > ?", token)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Queryko
|
2
|
+
module Filters
|
3
|
+
class Base
|
4
|
+
attr_reader :table_name, :column_name, :feature, :as, :field
|
5
|
+
|
6
|
+
def initialize(options = {}, feature)
|
7
|
+
@feature = feature
|
8
|
+
@table_name = options.fetch(:table_name) { @feature.query_object.defined_table_name }
|
9
|
+
@column_name = options.fetch(:column_name) { @feature.name }
|
10
|
+
@as = options[:as]
|
11
|
+
end
|
12
|
+
|
13
|
+
def field
|
14
|
+
@field ||= as || build_field_from_column
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_field_from_column
|
18
|
+
"#{column_name}_#{self.class.name.split('::').last.underscore}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "queryko/filters/base"
|
2
|
+
|
3
|
+
class Queryko::Filters::Before < Queryko::Filters::Base
|
4
|
+
def intialize(options = {}, feature)
|
5
|
+
super options, feature
|
6
|
+
end
|
7
|
+
|
8
|
+
def perform(collection, token)
|
9
|
+
collection.where("\"#{table_name}\".\"#{column_name}\" < ?", token)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "queryko/filters/base"
|
2
|
+
|
3
|
+
class Queryko::Filters::Max < Queryko::Filters::Base
|
4
|
+
def intialize(options = {}, feature)
|
5
|
+
super options, feature
|
6
|
+
end
|
7
|
+
|
8
|
+
def perform(collection, token)
|
9
|
+
collection.where("\"#{table_name}\".\"#{column_name}\" <= ?", token)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "queryko/filters/base"
|
2
|
+
|
3
|
+
class Queryko::Filters::Min < Queryko::Filters::Base
|
4
|
+
def intialize(options = {}, feature)
|
5
|
+
super options, feature
|
6
|
+
end
|
7
|
+
|
8
|
+
def perform(collection, token)
|
9
|
+
collection.where("\"#{table_name}\".\"#{column_name}\" >= ?", token)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def build_field_from_column
|
14
|
+
"#{column_name}_min"
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "queryko/filters/base"
|
2
|
+
|
3
|
+
class Queryko::Filters::Search < Queryko::Filters::Base
|
4
|
+
attr_reader :cond, :token_format
|
5
|
+
def initialize(options = {}, feature)
|
6
|
+
@cond = options.fetch(:cond) { :like }
|
7
|
+
@token_format = options[:token_format] || '%token%'
|
8
|
+
super options, feature
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform(collection, token)
|
12
|
+
query_cond, query_token = format_query_params(token)
|
13
|
+
table_property = "\"#{table_name}\".\"#{column_name}\""
|
14
|
+
|
15
|
+
collection.where("#{table_property} #{query_cond} ?", query_token)
|
16
|
+
end
|
17
|
+
|
18
|
+
def format_query_params(token)
|
19
|
+
@sql_cond ||= case cond.to_sym
|
20
|
+
when :like
|
21
|
+
['LIKE', token_format.gsub('token', token)]
|
22
|
+
when :eq
|
23
|
+
['=', token]
|
24
|
+
when :neq
|
25
|
+
['IS NOT', token]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/queryko/naming.rb
CHANGED
@@ -26,6 +26,10 @@ module Queryko
|
|
26
26
|
# class names should be in plural form by default. No need to tableize
|
27
27
|
klass.name.chomp('Query').split('::').last.underscore
|
28
28
|
end
|
29
|
+
|
30
|
+
def inferred_model
|
31
|
+
inferred_from_class_name.last.singularize.constantize
|
32
|
+
end
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
data/lib/queryko/query_object.rb
CHANGED
@@ -3,6 +3,8 @@ require "queryko/range_attributes"
|
|
3
3
|
require "queryko/searchables"
|
4
4
|
require "queryko/after_attributes"
|
5
5
|
require "queryko/naming"
|
6
|
+
require "queryko/able"
|
7
|
+
require "queryko/filterer"
|
6
8
|
|
7
9
|
module Queryko
|
8
10
|
class QueryObject
|
@@ -10,6 +12,8 @@ module Queryko
|
|
10
12
|
include Queryko::Naming
|
11
13
|
include Queryko::RangeAttributes
|
12
14
|
include Queryko::Searchables
|
15
|
+
include Queryko::Able
|
16
|
+
include Queryko::Filterer
|
13
17
|
# include AfterAttributes
|
14
18
|
|
15
19
|
def self.inherited(subclass)
|
@@ -18,7 +22,7 @@ module Queryko
|
|
18
22
|
end
|
19
23
|
|
20
24
|
def initialize(params = {}, rel)
|
21
|
-
@relation = @original_relation = rel
|
25
|
+
@relation = @original_relation = rel || inferred_model.all
|
22
26
|
@params = params
|
23
27
|
end
|
24
28
|
|
@@ -34,8 +38,7 @@ module Queryko
|
|
34
38
|
@performed = true
|
35
39
|
pre_filter
|
36
40
|
filter
|
37
|
-
|
38
|
-
filter_by_searchables
|
41
|
+
filter_by_filters
|
39
42
|
@countable_resource = relation
|
40
43
|
end
|
41
44
|
|
@@ -112,12 +115,11 @@ module Queryko
|
|
112
115
|
end
|
113
116
|
|
114
117
|
def by_ids
|
115
|
-
relation.where(id: params[:ids])
|
118
|
+
relation.where(id: params[:ids].split(','))
|
116
119
|
end
|
117
120
|
|
118
121
|
def since_id
|
119
|
-
relation.where("#{defined_table_name}
|
122
|
+
relation.where("\"#{defined_table_name}\".\"id\" > ?", params[:since_id])
|
120
123
|
end
|
121
|
-
|
122
124
|
end
|
123
125
|
end
|
@@ -2,38 +2,14 @@ module Queryko
|
|
2
2
|
module RangeAttributes
|
3
3
|
def self.included(base)
|
4
4
|
base.extend(ClassMethods)
|
5
|
-
base.class_eval do
|
6
|
-
class_attribute :range_attributes, default: Array.new, instance_writer: false
|
7
|
-
self.range_attributes = []
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def filter_by_range_attributes
|
12
|
-
self.range_attributes.each do |range_attribute|
|
13
|
-
self.relation = attribute_max("#{range_attribute}_max") if params["#{range_attribute}_max".to_sym]
|
14
|
-
self.relation = attribute_min("#{range_attribute}_min") if params["#{range_attribute}_min".to_sym]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
def attribute_min key
|
20
|
-
# Calm down. column_name is whitelisted. check #add_range_attributes method
|
21
|
-
column_name = key.to_s.gsub(/_min$/, "")
|
22
|
-
relation.where("#{defined_table_name}.#{column_name} >= ?", params[key.to_sym])
|
23
|
-
end
|
24
|
-
|
25
|
-
def attribute_max key
|
26
|
-
# Calm down. column_name is whitelisted. check #add_range_attributes method
|
27
|
-
column_name = key.to_s.gsub(/_max$/, "")
|
28
|
-
relation.where("#{defined_table_name}.#{column_name} <= ?", params[key.to_sym])
|
29
|
-
end
|
30
|
-
end
|
31
5
|
end
|
32
6
|
|
33
7
|
module ClassMethods
|
34
8
|
def add_range_attributes(*args)
|
35
|
-
|
36
|
-
|
9
|
+
args.each do |arg|
|
10
|
+
feature arg.to_sym, :min
|
11
|
+
feature arg.to_sym, :max
|
12
|
+
end
|
37
13
|
end
|
38
14
|
end
|
39
15
|
end
|
data/lib/queryko/searchables.rb
CHANGED
@@ -1,27 +1,15 @@
|
|
1
1
|
module Queryko
|
2
2
|
module Searchables
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class_attribute :searchables, default: Array.new, instance_writer: false
|
7
|
-
self.searchables = []
|
8
|
-
|
9
|
-
private
|
3
|
+
def self.included(base)
|
4
|
+
base.extend(ClassMethods)
|
5
|
+
end
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
module ClassMethods
|
8
|
+
def add_searchables(*args)
|
9
|
+
args.each do |arg|
|
10
|
+
feature arg.to_sym, :search, as: arg.to_sym
|
15
11
|
end
|
16
12
|
end
|
17
13
|
end
|
18
14
|
end
|
19
|
-
|
20
|
-
module ClassMethods
|
21
|
-
def add_searchables(*args)
|
22
|
-
self.searchables ||= []
|
23
|
-
self.searchables += args
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
15
|
end
|
data/lib/queryko/version.rb
CHANGED
data/lib/queryko.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
require "queryko/version"
|
2
2
|
require "queryko/query_object"
|
3
|
+
require "queryko/filters/base"
|
4
|
+
require "queryko/filters/after"
|
5
|
+
require "queryko/filters/before"
|
6
|
+
require "queryko/filters/min"
|
7
|
+
require "queryko/filters/max"
|
8
|
+
require "queryko/filters/search"
|
9
|
+
require "queryko/feature"
|
10
|
+
require "queryko/able"
|
11
|
+
require "queryko/filterer"
|
3
12
|
module Queryko
|
4
13
|
# Your code goes here...
|
5
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: queryko
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Nelson Valeros
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -143,14 +143,22 @@ files:
|
|
143
143
|
- bin/console
|
144
144
|
- bin/setup
|
145
145
|
- lib/queryko.rb
|
146
|
+
- lib/queryko/able.rb
|
146
147
|
- lib/queryko/after_attributes.rb
|
148
|
+
- lib/queryko/feature.rb
|
149
|
+
- lib/queryko/filterer.rb
|
150
|
+
- lib/queryko/filters/after.rb
|
151
|
+
- lib/queryko/filters/base.rb
|
152
|
+
- lib/queryko/filters/before.rb
|
153
|
+
- lib/queryko/filters/max.rb
|
154
|
+
- lib/queryko/filters/min.rb
|
155
|
+
- lib/queryko/filters/search.rb
|
147
156
|
- lib/queryko/naming.rb
|
148
157
|
- lib/queryko/query_object.rb
|
149
158
|
- lib/queryko/range_attributes.rb
|
150
159
|
- lib/queryko/searchables.rb
|
151
160
|
- lib/queryko/version.rb
|
152
161
|
- queryko.gemspec
|
153
|
-
- sandbox/users_query.rb
|
154
162
|
- test.html
|
155
163
|
homepage: https://github.com/neume/queryko
|
156
164
|
licenses:
|
@@ -167,9 +175,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
175
|
version: '0'
|
168
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
177
|
requirements:
|
170
|
-
- - "
|
178
|
+
- - ">"
|
171
179
|
- !ruby/object:Gem::Version
|
172
|
-
version:
|
180
|
+
version: 1.3.1
|
173
181
|
requirements: []
|
174
182
|
rubyforge_project:
|
175
183
|
rubygems_version: 2.7.6
|
data/sandbox/users_query.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
class UsersQuery
|
2
|
-
feature [:created_at, :updated_at, :deleted_at], filters: [
|
3
|
-
after: { as: -> (name) { "#{name}_after"}},
|
4
|
-
:before, :min, :max, search: { cond: :like, token_format: -> (token) { token.upcase }, as: :search_keyword}],
|
5
|
-
table_name: :users
|
6
|
-
|
7
|
-
feature :created_at, :search, cond: :like, token_format: '%token%'
|
8
|
-
feature :created_at, :min
|
9
|
-
feature :created_at, :max
|
10
|
-
|
11
|
-
feature :created_at, filters: [:after, :before, :min, :max, search: { cond: :like, token_format: '%token%', as: :q}]
|
12
|
-
|
13
|
-
feature :search, search: [{ column_name: :first_name, cond: :eq, token_format: 'token%'}]
|
14
|
-
|
15
|
-
# users.last_name ? ? OR users.name OR profiles.created_at
|
16
|
-
|
17
|
-
# def add_feature(name, options)
|
18
|
-
# features[name] = Queryko::Feature.new(name, options, self)
|
19
|
-
# end
|
20
|
-
end
|