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 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