find_with_order 1.0.1 → 1.1.0

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
  SHA1:
3
- metadata.gz: db2431c776b7124cdaa2e01efd6ec12bfdc1d513
4
- data.tar.gz: 68f959361cc19eb381f94eb82028502f09b6f0f9
3
+ metadata.gz: 4b55d8a4b8781f20d1a7d637f7d0c1ff0a71f802
4
+ data.tar.gz: 95b37ac957f5fce50237e4869ce4702aa3a524a2
5
5
  SHA512:
6
- metadata.gz: bbe7b8e24e8afe6f51869f3dbac286f6361485b10229aa436ac395e69b6882291486747c6ea8d560650dff25e79bb59c0de577c20b49f12862f1c0caabc913da
7
- data.tar.gz: 65080703b7bc52021f0e8096af1a591360afb238858761debc0e368b54e761c7061b36b23a7ec54ea53a8e51b81be166955a9d79d67df7232d66014d52f62ac3
6
+ metadata.gz: e4bfb50a7c782f329b8834ac21cac0dfe78e4dd7b3d027c7d0ac479f27cde0e51c2cbbec240a8f8b2cb72e7e49d421ea47e1992a4debf77f7896e0ebdfe5546c
7
+ data.tar.gz: 8a02ff25f68581747bd2a641ae147e900fe9e26e6d95269a02e1e7504caf04644d260e986cce0d2904a41af79787ac2c0c3025f686f378f08cbaa39cadab7ff4
data/.travis.yml CHANGED
@@ -4,12 +4,18 @@ rvm:
4
4
  - 2.3
5
5
  sudo: required
6
6
  dist: trusty
7
+ env:
8
+ - DB=mysql
9
+ - DB=pg
10
+ services:
11
+ - postgresql
7
12
  before_install:
8
13
  - gem install bundler
9
14
  - gem update --system
10
15
  - gem --version
11
16
  before_script:
12
- - mysql -u root -e 'CREATE DATABASE test;'
17
+ - mysql -u root -e 'CREATE DATABASE travis_ci_test;'
18
+ - psql -c 'create database travis_ci_test;' -U postgres
13
19
  gemfile:
14
20
  - gemfiles/3.2.gemfile
15
21
  - gemfiles/4.2.gemfile
data/README.md CHANGED
@@ -1,11 +1,12 @@
1
+
2
+ # FindWithOrder
3
+
1
4
  [![Gem Version](https://img.shields.io/gem/v/find_with_order.svg?style=flat)](https://rubygems.org/gems/find_with_order)
2
5
  [![Build Status](https://travis-ci.org/khiav223577/find_with_order.svg?branch=master)](https://travis-ci.org/khiav223577/find_with_order)
3
6
  [![RubyGems](http://img.shields.io/gem/dt/find_with_order.svg?style=flat)](https://rubygems.org/gems/find_with_order)
4
7
  [![Code Climate](https://codeclimate.com/github/khiav223577/find_with_order/badges/gpa.svg)](https://codeclimate.com/github/khiav223577/find_with_order)
5
8
  [![Test Coverage](https://codeclimate.com/github/khiav223577/find_with_order/badges/coverage.svg)](https://codeclimate.com/github/khiav223577/find_with_order/coverage)
6
9
 
7
- # FindWithOrder
8
-
9
10
  Find records in the same order of input array.
10
11
 
11
12
  ## Installation
@@ -55,7 +56,7 @@ Find then sort by hash mapping 1.120000 0.010000 1.130000 ( 1.192891)
55
56
 
56
57
  ## Development
57
58
 
58
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
59
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test DB=mysql` / `rake test DB=pg` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
59
60
 
60
61
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
61
62
 
@@ -30,8 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "bundler", "~> 1.11"
31
31
  spec.add_development_dependency "rake", "~> 12.0"
32
32
  spec.add_development_dependency "minitest", "~> 5.0"
33
+ spec.add_development_dependency "mysql2", ">= 0.3"
34
+ spec.add_development_dependency "pg", "~> 0.18"
33
35
 
34
36
  spec.add_dependency "rails", ">= 3"
35
- spec.add_dependency "mysql2", ">= 0.3"
36
37
 
37
38
  end
data/gemfiles/3.2.gemfile CHANGED
@@ -5,7 +5,10 @@ source 'https://rubygems.org'
5
5
  gem "activerecord", "~> 3.2"
6
6
 
7
7
  group :test do
8
- gem 'mysql2' , '0.3.21'
8
+ case ENV['DB']
9
+ when "mysql" ; gem 'mysql2' , '0.3.21'
10
+ when "postgres" ; gem 'pg', '~> 0.18'
11
+ end
9
12
  gem "simplecov"
10
13
  gem "codeclimate-test-reporter", "~> 1.0.0"
11
14
  end
data/gemfiles/4.2.gemfile CHANGED
@@ -5,7 +5,10 @@ source 'https://rubygems.org'
5
5
  gem "activerecord", "~> 4.2"
6
6
 
7
7
  group :test do
8
- gem 'mysql2' , '0.3.21'
8
+ case ENV['DB']
9
+ when "mysql" ; gem 'mysql2' , '0.3.21'
10
+ when "postgres" ; gem 'pg', '~> 0.18'
11
+ end
9
12
  gem "simplecov"
10
13
  gem "codeclimate-test-reporter", "~> 1.0.0"
11
14
  end
data/gemfiles/5.0.gemfile CHANGED
@@ -5,7 +5,10 @@ source 'https://rubygems.org'
5
5
  gem "activerecord", "~> 5.0"
6
6
 
7
7
  group :test do
8
- gem 'mysql2' , '0.3.21'
8
+ case ENV['DB']
9
+ when "mysql" ; gem 'mysql2' , '0.3.21'
10
+ when "postgres" ; gem 'pg', '~> 0.18'
11
+ end
9
12
  gem "simplecov"
10
13
  gem "codeclimate-test-reporter", "~> 1.0.0"
11
14
  end
@@ -1,16 +1,20 @@
1
1
  require "find_with_order/version"
2
+ require "find_with_order/mysql_support"
3
+ require "find_with_order/pg_support"
2
4
  require 'active_record'
3
5
 
4
6
  class << ActiveRecord::Base
5
7
  def find_with_order(ids)
6
8
  return none if ids.blank?
7
9
  ids = ids.uniq
8
- return where(id: ids).order("field(#{table_name}.id, #{ids.join(',')})").to_a
10
+ return FindWithOrder::PGSupport.find_with_order(self, ids) if defined?(PG)
11
+ return FindWithOrder::MysqlSupport.find_with_order(self, ids)
9
12
  end
10
13
  def where_with_order(column, ids)
11
14
  return none if ids.blank?
12
15
  ids = ids.uniq
13
- return where(column => ids).order("field(#{column}, #{ids.map(&:inspect).join(',')})")
16
+ return FindWithOrder::PGSupport.where_with_order(self, column, ids) if defined?(PG)
17
+ return FindWithOrder::MysqlSupport.where_with_order(self, column, ids)
14
18
  end
15
19
  end
16
20
  unless ActiveRecord::Base.respond_to?(:none) # extend only if not implement yet
@@ -0,0 +1,10 @@
1
+ module FindWithOrder
2
+ module MysqlSupport
3
+ def self.find_with_order(relation, ids)
4
+ return relation.where(id: ids).order("field(#{relation.table_name}.id, #{ids.join(',')})").to_a
5
+ end
6
+ def self.where_with_order(relation, column, ids)
7
+ return relation.where(column => ids).order("field(#{column}, #{ids.map(&:inspect).join(',')})")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ module FindWithOrder
2
+ module PGSupport
3
+ def self.find_with_order(relation, ids)
4
+ # return relation.where(id: ids).order("array_position(ARRAY[#{ids.join(',')}], #{relation.table_name}.id)").to_a #array_position is only support in PG >= 9.5
5
+ return relation.where(id: ids)
6
+ .joins("JOIN (SELECT id.val, row_number() over() FROM (VALUES(#{ids.join('),(')})) AS id(val)) AS id ON (#{relation.table_name}.id = id.val)")
7
+ .order('row_number')
8
+ end
9
+ def self.where_with_order(relation, column, ids)
10
+ relation = relation.where(column => ids)
11
+ case ids.first
12
+ when Numeric
13
+ # return relation.order("array_position(ARRAY[#{ids.join(',')}], #{column})") #array_position is only support in PG >= 9.5
14
+ return relation.joins("JOIN (SELECT id.val, row_number() over() FROM (VALUES(#{ids.join('),(')})) AS id(val)) AS id ON (#{column} = id.val)")
15
+ .order('row_number')
16
+ when String
17
+ ids.map!{|s| ActiveRecord::Base.connection.quote_string(s) }
18
+ # return relation.order("array_position(ARRAY['#{ids.join("','")}']::varchar[], #{column})") #array_position is only support in PG >= 9.5
19
+ return relation.joins("JOIN (SELECT id.val, row_number() over() FROM (VALUES('#{ids.join("'),('")}')) AS id(val)) AS id ON (#{column} = id.val)")
20
+ .order('row_number')
21
+ else
22
+ raise "not support type: #{ids.first.class}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module FindWithOrder
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: find_with_order
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-03 00:00:00.000000000 Z
11
+ date: 2017-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,33 +53,47 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rails
56
+ name: mysql2
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '3'
62
- type: :runtime
61
+ version: '0.3'
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '3'
68
+ version: '0.3'
69
69
  - !ruby/object:Gem::Dependency
70
- name: mysql2
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.18'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.18'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '0.3'
89
+ version: '3'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '0.3'
96
+ version: '3'
83
97
  description: A simple way to find records in the same order of input array. Has better
84
98
  performance than manually sorting. Supports Rails 3+.
85
99
  email:
@@ -101,6 +115,8 @@ files:
101
115
  - gemfiles/4.2.gemfile
102
116
  - gemfiles/5.0.gemfile
103
117
  - lib/find_with_order.rb
118
+ - lib/find_with_order/mysql_support.rb
119
+ - lib/find_with_order/pg_support.rb
104
120
  - lib/find_with_order/version.rb
105
121
  homepage: https://github.com/khiav223577/find_with_order
106
122
  licenses:
@@ -122,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
138
  version: '0'
123
139
  requirements: []
124
140
  rubyforge_project:
125
- rubygems_version: 2.6.8
141
+ rubygems_version: 2.4.8
126
142
  signing_key:
127
143
  specification_version: 4
128
144
  summary: A simple way to find records in the same order of input array.