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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5abee021e4a9e6e10f599c8d96f78c5b2790d515f91c672425542e5e830f0a94
4
- data.tar.gz: b908d039c63428311f2801ae8b1144668188de4654407635e2d48504127354ff
3
+ metadata.gz: 11e57021d0bfe6379466a379cb14975b281f328683dbe7a33acbda07524e9dec
4
+ data.tar.gz: 614d9a1789c273a5a7ca00896f343ae55e1d79e802973793feff7eb0b044c66a
5
5
  SHA512:
6
- metadata.gz: da10402916196e7302f9b577046f09a17a7670953608f0bf91f1b64af8265c7c5708ed59b9907d65b76017da376b2efe754957f7bc5f7085a7712011834224f1
7
- data.tar.gz: a842ff4737ac477f374cc1cf2788fcfc9b716c5f0e3a624e6825d033fb1215925b35005d9e10d4d2b888ab0eff956f78562c64995b5591022ab7d806d5027046
6
+ metadata.gz: 9220fa20b26cf34c7e2db0ae2dc8a0db229d33cd970815f5d251f849be2661783c9c6400be27434fca0e40e0ea81e48348e7e2aacde16759c315cd39df9b63ee
7
+ data.tar.gz: a1f98bbc374decd1f572ddac4308c5a91faf5afca06a89e7f2716fb0efebe8d576aa9384d0de43ba75af2a24d3552d188ccb10c2e4a285a86a641901480c1110
data/.gitignore CHANGED
@@ -10,3 +10,4 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
  .ruby-version
13
+ sandbox
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- queryko (1.1.4)
4
+ queryko (1.2.0.beta)
5
5
  activerecord (>= 4.0)
6
6
  activesupport (>= 4.0)
7
7
 
@@ -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
- def self.included(base)
4
- base.extend(ClassMethods)
5
- base.class_eval do
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
- def filter_after_attributes
12
- self.after_attributes.each do |attribute|
13
- if params["after_#{attribute}".to_sym].present?
14
- filter_after attribute
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
+ module Queryko
2
+ module Filterer
3
+ def filter_by_filters
4
+ fields.each do |field, filter|
5
+ # puts field
6
+ # puts filter, filter.first.class.name
7
+ self.relation = filter.first.perform(relation, params[field]) if params[field]
8
+ end
9
+ end
10
+ end
11
+ 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
@@ -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
@@ -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
- filter_by_range_attributes
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}.id > ?", params[:since_id])
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
- self.range_attributes ||= []
36
- self.range_attributes += args
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
@@ -1,27 +1,15 @@
1
1
  module Queryko
2
2
  module Searchables
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- base.class_eval do
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
- def filter_by_searchables
12
- self.searchables.each do |searchable|
13
- column = searchable.to_sym
14
- self.relation = relation.where(column => params[column]) if params[column].present?
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
@@ -1,3 +1,3 @@
1
1
  module Queryko
2
- VERSION = "1.1.4"
2
+ VERSION = "1.2.0.beta"
3
3
  end
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.1.4
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-06-08 00:00:00.000000000 Z
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: '0'
180
+ version: 1.3.1
173
181
  requirements: []
174
182
  rubyforge_project:
175
183
  rubygems_version: 2.7.6
@@ -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