queryko 1.1.4 → 1.2.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
|