searchkon 0.1.1 → 0.1.2

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: 5c3a98b95fd101cdff626be2a58c06db08136f252913bea0951de36291efc6f2
4
- data.tar.gz: 38a365ea4287172a83922d2cc44ba1a4cb4182be2376f0d0164ba09b7c27f936
3
+ metadata.gz: 5d1a85dcbc2fa987d795fc2cd5b70268215edec815153f6e7faba8b087756e7e
4
+ data.tar.gz: 94ab0e106400d8b08d9f4a6cd3eaeba30361e7450a469d3975e7225b01b33327
5
5
  SHA512:
6
- metadata.gz: 973e2e6d10e9b0186487013ca5fa3ffc941875cd02f0a523703e2586cbf031394e8affb182405d4cd6456fb8e7a2d4f34387be5f97c1df3f4f413bb2e67914f8
7
- data.tar.gz: 1d225347ce400fe97012cc29f91beb753d0c0b5a3e39147553faa152170b359a35df88466cf88499a082f5ae641f1e0a7f7b81baaba7f3c46998b738a83b3794
6
+ metadata.gz: aa72df68a529c67c96221351087865476c337d46462d32c3298eb305621e4c845d4f1e9bb88e1e04032077cbf976364950c0c6c0ff0044be9a70a67aa652393c
7
+ data.tar.gz: c8ba2cf75c2160a480e515f5c5abd8db9a53d05498dd2d87e8835a01d12262d49d4c0d18cb68f771cc2872176e14fb85112a96e04a5eabb14900eaa8ec01c41b
data/Gemfile CHANGED
@@ -2,3 +2,5 @@
2
2
  source "http://rubygems.org"
3
3
 
4
4
  gemspec
5
+ gem 'activerecord', '~> 5.0', '>= 5.0.0.1'
6
+ gem 'activesupport', '~> 5.0', '>= 5.0.0.1'
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'searchkon'
3
- s.version = '0.1.1'
3
+ s.version = '0.1.2'
4
4
  s.date = '2020-05-24'
5
5
  s.summary = "Search Command"
6
6
  s.description = "make search easy"
7
7
  s.authors = ["Majid Imanzade"]
8
8
  s.email = 'majidimanzade1@gmail.com'
9
- s.homepage = 'https://rubygems.org/gems/Helliot'
10
- s.homepage = "http://github.com/majidimanzade/Helliot"
9
+ s.homepage = 'https://rubygems.org/gems/searchkon'
10
+ s.homepage = "http://github.com/majidimanzade/searchkon"
11
11
  s.license = 'MIT'
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
15
15
  s.add_development_dependency("bundler")
16
16
  s.add_development_dependency("rake")
17
17
  s.add_development_dependency("rspec")
18
+ s.add_development_dependency "sqlite3"
18
19
  end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class DummyClass
4
+ include Searchkon::RegexFormatter
5
+ include Searchkon::Filterable
6
+ end
7
+
8
+ RSpec.describe Searchkon::Filterable do
9
+ describe 'filterable test' do
10
+ it 'should return correct filter with scope' do
11
+ filrtetables = {
12
+ like: ['name', 'cities.name'],
13
+ exact: ['cities.id']
14
+ }
15
+ filters = {'cities.name,name': 'Don', 'cities.id': 1}
16
+ result = [{:value=>1, :key => "cities.id", :scope=>:exact},
17
+ {:value=>"Don", :key=> "cities.name,name", :scope=>:fulltext}]
18
+
19
+ dc = DummyClass.new
20
+
21
+ expect(dc.validate_params(filters, filrtetables)).to eq result
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class Product < ActiveRecord::Base
2
+ self.abstract_class = true
3
+
4
+ def self.searchable_columns
5
+ {
6
+ like: ['title', 'coupons.code'],
7
+ exact: [
8
+ 'created_at',
9
+ 'coupons.id',
10
+ 'id'
11
+ ]
12
+ }
13
+ end
14
+ end
@@ -0,0 +1,116 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/product')
3
+ RSpec.describe Searchkon::QueryBuilder do
4
+ describe 'query builder for filter' do
5
+ let (:simple_where_params) do
6
+ {
7
+ filters: {
8
+ id: 1,
9
+ title: 'foobar'
10
+ }
11
+ }
12
+ end
13
+
14
+ let (:simple_range_params) do
15
+ {
16
+ filters: {
17
+ id: '(1..10)',
18
+ created_at: '(2012-12-21..2019-12-21)'
19
+ }
20
+ }
21
+ end
22
+
23
+ let (:range_and_array_where_params) do
24
+ {
25
+ filters: {
26
+ id: [1,2,3,4,5],
27
+ created_at: '(2012-12-21..2019-12-21)'
28
+ }
29
+ }
30
+ end
31
+
32
+ it 'should return simple where query' do
33
+ query = "SELECT \"products\".* FROM \"products\" WHERE (products.title like '%foobar%') AND \"products\".\"id\" = 1"
34
+
35
+ expect(Searchkon::QueryBuilder.filter('Product', simple_where_params).to_sql).to eq query
36
+ end
37
+
38
+ it 'should return simple range query' do
39
+ query = "SELECT \"products\".* FROM \"products\" WHERE (products.created_at between '2012-12-21' and '2019-12-21') AND (products.id between '1' and '10')"
40
+
41
+ expect(Searchkon::QueryBuilder.filter('Product', simple_range_params).to_sql).to eq query
42
+ end
43
+
44
+ it 'should return simple where relational query' do
45
+ relational_params = { filters: { 'coupons.id': 1 } }
46
+ query = "SELECT \"products\".* FROM \"products\" INNER JOIN \"coupons\" ON \"coupons\".\"product_id\" = \"products\".\"id\" WHERE \"coupons\".\"id\" = 1"
47
+
48
+ expect(Searchkon::QueryBuilder.filter('Product', relational_params).to_sql).to eq query
49
+ end
50
+
51
+ it 'should return range relational query' do
52
+ relational_params = { filters: { 'coupons.id': [1,2,3] } }
53
+ query = "SELECT \"products\".* FROM \"products\" INNER JOIN \"coupons\" ON \"coupons\".\"product_id\" = \"products\".\"id\" WHERE \"coupons\".\"id\" IN (1, 2, 3)"
54
+
55
+ expect(Searchkon::QueryBuilder.filter('Product', relational_params).to_sql).to eq query
56
+ end
57
+
58
+ it 'should return simple where relational query with two relations' do
59
+ relational_params = { filters: { 'coupons.id': 1, 'payments.id': 1 } }
60
+ query = "SELECT \"products\".* FROM \"products\" INNER JOIN \"payments\" ON \"payments\".\"product_id\" = \"products\".\"id\" INNER JOIN \"coupons\" ON \"coupons\".\"product_id\" = \"products\".\"id\" WHERE \"payments\".\"id\" = 1 AND \"coupons\".\"id\" = 1"
61
+
62
+ expect(Searchkon::QueryBuilder.filter('Product', relational_params).to_sql).to eq query
63
+ end
64
+
65
+ it 'should return range query and array where' do
66
+ query = "SELECT \"products\".* FROM \"products\" WHERE (products.created_at between '2012-12-21' and '2019-12-21') AND \"products\".\"id\" IN (1, 2, 3, 4, 5)"
67
+
68
+ expect(Searchkon::QueryBuilder.filter('Product', range_and_array_where_params).to_sql).to eq query
69
+ end
70
+
71
+ it 'should return all if params empty' do
72
+ query = "SELECT \"products\".* FROM \"products\""
73
+
74
+ expect(Searchkon::QueryBuilder.filter('Product', {}).to_sql).to eq query
75
+ end
76
+
77
+ it 'should raise error if model not exist' do
78
+ expect { Searchkon::QueryBuilder.filter('foobar', simple_where_params) }.to raise_error NameError
79
+ end
80
+
81
+ it 'should return all if all filter column not exist' do
82
+ query = "SELECT \"products\".* FROM \"products\""
83
+ invalid_mock_params = {
84
+ filters: {
85
+ blah: 1,
86
+ foo: 'foobar'
87
+ }
88
+ }
89
+
90
+ expect(Searchkon::QueryBuilder.filter('Product', invalid_mock_params).to_sql).to eq query
91
+ end
92
+
93
+ it 'should return query if one filter column not exist' do
94
+ query = "SELECT \"products\".* FROM \"products\" WHERE \"products\".\"id\" = 1"
95
+ some_invalid_mock_params = {
96
+ filters: {
97
+ id: 1,
98
+ foo: 'foobar'
99
+ }
100
+ }
101
+
102
+ expect(Searchkon::QueryBuilder.filter('Product', some_invalid_mock_params).to_sql).to eq query
103
+ end
104
+
105
+ it 'should return fulltext query if params has fulltext key' do
106
+ query = "SELECT \"products\".* FROM \"products\" INNER JOIN \"coupons\" ON \"coupons\".\"product_id\" = \"products\".\"id\" WHERE (products.title like '%foobar%' or coupons.code like '%foobar%')"
107
+ params = {
108
+ filters: {
109
+ 'title,coupons.code': 'foobar'
110
+ }
111
+ }
112
+
113
+ expect(Searchkon::QueryBuilder.filter('Product', params).to_sql).to eq query
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,11 @@
1
+ ActiveRecord::Schema.define do
2
+ self.verbose = false
3
+
4
+ create_table :products, :force => true do |t|
5
+ t.string :key
6
+ t.string :name
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ end
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'searchkon'
5
+ require 'active_record'
6
+ require 'active_support'
7
+ require 'active_support/core_ext'
8
+ require 'rspec'
9
+
10
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
11
+
12
+ load File.dirname(__FILE__) + '/schema.rb'
13
+ require File.dirname(__FILE__) + '/product.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: searchkon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Majid Imanzade
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: make search easy
56
70
  email: majidimanzade1@gmail.com
57
71
  executables: []
@@ -62,14 +76,18 @@ files:
62
76
  - Gemfile
63
77
  - LICENSE
64
78
  - README.md
65
- - elliot-0.0.1.gem
66
79
  - lib/searchkon.rb
67
80
  - lib/searchkon/filterable.rb
68
81
  - lib/searchkon/query_builder.rb
69
82
  - lib/searchkon/regex_formatter.rb
70
83
  - lib/searchkon/searchables.rb
71
84
  - searchkon.gemspec
72
- homepage: http://github.com/majidimanzade/Helliot
85
+ - spec/filterable_spec.rb
86
+ - spec/product.rb
87
+ - spec/query_builder_spec.rb
88
+ - spec/schema.rb
89
+ - spec/spec_helper.rb
90
+ homepage: http://github.com/majidimanzade/searchkon
73
91
  licenses:
74
92
  - MIT
75
93
  metadata: {}