arel_extensions 0.8.3 → 0.8.4
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 +4 -4
- data/.travis/oracle/download.js +116 -0
- data/.travis/oracle/download.sh +16 -0
- data/.travis/oracle/install.sh +32 -0
- data/.travis.yml +72 -69
- data/Rakefile +29 -4
- data/arel_extensions.gemspec +1 -1
- data/functions.html +21 -12
- data/gemfiles/rails4.gemfile +11 -3
- data/gemfiles/rails5.gemfile +8 -4
- data/lib/arel_extensions/math.rb +2 -2
- data/lib/arel_extensions/math_functions.rb +1 -1
- data/lib/arel_extensions/nodes/concat.rb +16 -0
- data/lib/arel_extensions/nodes/date_diff.rb +37 -25
- data/lib/arel_extensions/nodes/function.rb +30 -0
- data/lib/arel_extensions/nodes/is_null.rb +6 -0
- data/lib/arel_extensions/nodes/replace.rb +8 -26
- data/lib/arel_extensions/nodes/round.rb +6 -6
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +2 -2
- data/lib/arel_extensions/string_functions.rb +5 -1
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mysql.rb +89 -113
- data/lib/arel_extensions/visitors/oracle.rb +28 -65
- data/lib/arel_extensions/visitors/postgresql.rb +82 -121
- data/lib/arel_extensions/visitors/sqlite.rb +60 -55
- data/lib/arel_extensions/visitors/to_sql.rb +30 -5
- data/test/database.yml +15 -3
- data/test/real_db_test.rb +0 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +2 -1
- data/test/visitors/test_oracle.rb +2 -2
- data/test/visitors/test_to_sql.rb +3 -4
- data/test/with_ar/all_agnostic_test.rb +294 -0
- data/test/with_ar/insert_agnostic_test.rb +52 -0
- data/test/with_ar/test_bulk_sqlite.rb +3 -2
- metadata +10 -5
- data/lib/arel_extensions/nodes/isnull.rb +0 -30
- data/test/with_ar/test_string_postgresql.rb +0 -81
| @@ -0,0 +1,294 @@ | |
| 1 | 
            +
            require 'helper'
         | 
| 2 | 
            +
            require 'date'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module ArelExtensions
         | 
| 5 | 
            +
              module WthAr
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class ListTest < Minitest::Test
         | 
| 8 | 
            +
                  def setup_db
         | 
| 9 | 
            +
                    ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
         | 
| 10 | 
            +
                    ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
         | 
| 11 | 
            +
                    ActiveRecord::Base.default_timezone = :utc
         | 
| 12 | 
            +
                    @cnx = ActiveRecord::Base.connection
         | 
| 13 | 
            +
                    $sqlite ||= false
         | 
| 14 | 
            +
                    if ActiveRecord::Base.connection.adapter_name =~ /sqlite/i
         | 
| 15 | 
            +
                      $sqlite = true
         | 
| 16 | 
            +
                      db = @cnx.raw_connection
         | 
| 17 | 
            +
                      $load_extension_disabled ||= false
         | 
| 18 | 
            +
                      if !$load_extension_disabled
         | 
| 19 | 
            +
                        begin
         | 
| 20 | 
            +
                          db.create_function("find_in_set", 1) do |func, value1, value2|
         | 
| 21 | 
            +
                            func.result = value1.index(value2)
         | 
| 22 | 
            +
                          end
         | 
| 23 | 
            +
                          db.enable_load_extension(1)
         | 
| 24 | 
            +
                          db.load_extension("/usr/lib/sqlite3/pcre.so")
         | 
| 25 | 
            +
                          db.load_extension("/usr/lib/sqlite3/extension-functions.so")
         | 
| 26 | 
            +
                          db.enable_load_extension(0)
         | 
| 27 | 
            +
                          #function find_in_set
         | 
| 28 | 
            +
                        rescue => e
         | 
| 29 | 
            +
                          $load_extension_disabled = true
         | 
| 30 | 
            +
                          puts "can not load extensions #{e.inspect}"
         | 
| 31 | 
            +
                        end
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                    if File.exist?("init/#{ENV['DB']}.sql")
         | 
| 35 | 
            +
                      sql = File.read("init/#{ENV['DB']}.sql")
         | 
| 36 | 
            +
                      @cnx.execute(sql) unless sql.blank?
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                    @cnx.drop_table(:users) rescue nil 
         | 
| 39 | 
            +
                    @cnx.create_table :users do |t|
         | 
| 40 | 
            +
                      t.column :age, :integer
         | 
| 41 | 
            +
                      t.column :name, :string
         | 
| 42 | 
            +
                      t.column :comments, :text
         | 
| 43 | 
            +
                      t.column :created_at, :date
         | 
| 44 | 
            +
                      t.column :updated_at, :datetime
         | 
| 45 | 
            +
                      t.column :score, :decimal, :precision => 20, :scale => 10
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                    @cnx.drop_table(:products) rescue nil
         | 
| 48 | 
            +
                    @cnx.create_table :products do |t|
         | 
| 49 | 
            +
                      t.column :price, :decimal, :precision => 20, :scale => 10
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  def teardown_db
         | 
| 54 | 
            +
                    @cnx.drop_table(:users)
         | 
| 55 | 
            +
                    @cnx.drop_table(:products)
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  class User < ActiveRecord::Base
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                  class Product < ActiveRecord::Base
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
                  def setup
         | 
| 65 | 
            +
                    d = Date.new(2016,05,23)
         | 
| 66 | 
            +
                    setup_db
         | 
| 67 | 
            +
                    u = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
         | 
| 68 | 
            +
                    @lucas = User.where(:id => u.id)
         | 
| 69 | 
            +
                    u = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
         | 
| 70 | 
            +
                    @sophie = User.where(:id => u.id)
         | 
| 71 | 
            +
                    u = User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
         | 
| 72 | 
            +
                    @camille = User.where(:id => u.id)
         | 
| 73 | 
            +
                    u = User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
         | 
| 74 | 
            +
                    @arthur = User.where(:id => u.id)
         | 
| 75 | 
            +
                    u = User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
         | 
| 76 | 
            +
                    @myung = User.where(:id => u.id)
         | 
| 77 | 
            +
                    u = User.create :age => 25, :name => "Laure", :created_at => d, :score => 20.16
         | 
| 78 | 
            +
                    @laure = User.where(:id => u.id)
         | 
| 79 | 
            +
                    u = User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
         | 
| 80 | 
            +
                    @test = User.where(:id => u.id)
         | 
| 81 | 
            +
                    u = User.create :age => -42, :name => "Negatif", :comments => '1,22,3,42,2', :created_at => d, :updated_at => d.to_time, :score => 0.17
         | 
| 82 | 
            +
                    @neg = User.where(:id => u.id)
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    @age = User.arel_table[:age]
         | 
| 85 | 
            +
                    @name = User.arel_table[:name]
         | 
| 86 | 
            +
                    @score = User.arel_table[:score]
         | 
| 87 | 
            +
                    @created_at = User.arel_table[:created_at]
         | 
| 88 | 
            +
                    @comments = User.arel_table[:comments]
         | 
| 89 | 
            +
                    @price = Product.arel_table[:price]
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                  def teardown
         | 
| 93 | 
            +
                    teardown_db
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  def t(scope, node)
         | 
| 97 | 
            +
                    scope.select(node.as('res')).first.res
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  # Math Functions
         | 
| 101 | 
            +
                  def test_classical_arel
         | 
| 102 | 
            +
                    assert_in_epsilon 42.16, t(@laure, @score + 22), 0.01
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  def test_abs
         | 
| 106 | 
            +
                    assert_equal 42, t(@neg, @age.abs)
         | 
| 107 | 
            +
                    assert_equal 14, t(@laure, (@age - 39).abs)
         | 
| 108 | 
            +
                    assert_equal 28, t(@laure, (@age - 39).abs + (@age - 39).abs)
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                  def test_ceil
         | 
| 112 | 
            +
                    if !$sqlite || !$load_extension_disabled
         | 
| 113 | 
            +
                      assert_equal 1, t(@neg, @score.ceil)
         | 
| 114 | 
            +
                      assert_equal 63, t(@arthur, @age.ceil + 42)
         | 
| 115 | 
            +
                    end
         | 
| 116 | 
            +
                  end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                  def test_floor
         | 
| 119 | 
            +
                    if !$sqlite || !$load_extension_disabled
         | 
| 120 | 
            +
                      assert_equal 0, t(@neg, @score.floor)
         | 
| 121 | 
            +
                      assert_equal 42, t(@arthur, @score.floor - 23)
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  def test_rand
         | 
| 126 | 
            +
                    assert 42 != User.select(Arel.rand.as('res')).first.res
         | 
| 127 | 
            +
                    assert 0 <= User.select(Arel.rand.abs.as('res')).first.res
         | 
| 128 | 
            +
                    assert_equal 8, User.order(Arel.rand).limit(50).count
         | 
| 129 | 
            +
                  end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                  def test_round
         | 
| 132 | 
            +
                    assert_equal 1, User.where(@age.round(0).eq(5.0)).count
         | 
| 133 | 
            +
                    assert_equal 0, User.where(@age.round(-1).eq(6.0)).count
         | 
| 134 | 
            +
                    assert_equal 66, t(@arthur, @score.round)
         | 
| 135 | 
            +
                    assert_in_epsilon 67.6, t(@arthur, @score.round(1) + 2), 0.01
         | 
| 136 | 
            +
                  end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                  def test_sum
         | 
| 139 | 
            +
                    assert_equal 68, User.select((@age.sum + 1).as("res")).take(50).first.res
         | 
| 140 | 
            +
                    assert_equal 134, User.select((@age.sum + @age.sum).as("res")).take(50).first.res
         | 
| 141 | 
            +
                    assert_equal 201, User.select(((@age * 3).sum).as("res")).take(50).first.res
         | 
| 142 | 
            +
                    assert_equal 4009, User.select(((@age * @age).sum).as("res")).take(50).first.res
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  # String Functions
         | 
| 146 | 
            +
                  def test_concat
         | 
| 147 | 
            +
                    assert_equal 'Camille Camille', t(@camille, @name + ' ' + @name)
         | 
| 148 | 
            +
                    assert_equal 'Laure 2', t(@laure, @name + ' ' + 2)
         | 
| 149 | 
            +
                    if ENV['DB'] == 'postgresql'
         | 
| 150 | 
            +
                      assert_equal "Lucas Sophie", t(User.reorder(nil).from(User.select(:name).where(:name => ['Lucas', 'Sophie']).reorder(:name).as('users')), @name.group_concat(' '))
         | 
| 151 | 
            +
                    else
         | 
| 152 | 
            +
                      assert_equal "Lucas Sophie", t(User.where(:name => ['Lucas', 'Sophie']).reorder(:name), @name.group_concat(' '))
         | 
| 153 | 
            +
                    end
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  def test_length
         | 
| 157 | 
            +
                    assert_equal 7, t(@camille, @name.length)
         | 
| 158 | 
            +
                    assert_equal 7, t(@camille, @name.length.round.abs)
         | 
| 159 | 
            +
                    assert_equal 42, t(@laure, @name.length + 37)
         | 
| 160 | 
            +
                  end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  def test_locate
         | 
| 163 | 
            +
                    if !$sqlite || !$load_extension_disabled
         | 
| 164 | 
            +
                      assert_equal 1, t(@camille, @name.locate("C"))
         | 
| 165 | 
            +
                      assert_equal 0, t(@lucas, @name.locate("z"))
         | 
| 166 | 
            +
                      assert_equal 5, t(@lucas, @name.locate("s"))
         | 
| 167 | 
            +
                    end
         | 
| 168 | 
            +
                  end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                  def test_find_in_set
         | 
| 171 | 
            +
                    if !$sqlite || !$load_extension_disabled
         | 
| 172 | 
            +
                      assert 4, t(@neg, @comments & 2)
         | 
| 173 | 
            +
                      assert 2, t(@neg, @comments & 6)
         | 
| 174 | 
            +
                    end
         | 
| 175 | 
            +
                  end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                  def test_string_comparators
         | 
| 178 | 
            +
                    assert 1, t(@neg, @name >= 'test')
         | 
| 179 | 
            +
                    assert 1, t(@neg, @name <= @comments)
         | 
| 180 | 
            +
                  end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                  def test_regexp_not_regex
         | 
| 183 | 
            +
                    if !$sqlite || !$load_extension_disabled
         | 
| 184 | 
            +
                      assert_equal 1, User.where(@name =~ '^M').count
         | 
| 185 | 
            +
                      assert_equal 6, User.where(@name !~ '^L').count
         | 
| 186 | 
            +
                      assert_equal 1, User.where(@name =~ /^M/).count
         | 
| 187 | 
            +
                      assert_equal 6, User.where(@name !~ /^L/).count
         | 
| 188 | 
            +
                    end
         | 
| 189 | 
            +
                  end
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                  def test_imatches
         | 
| 192 | 
            +
                    assert_equal 1, User.where(@name.imatches('m%')).count
         | 
| 193 | 
            +
                    assert_equal 4, User.where(@name.imatches_any(['L%', '%e'])).count
         | 
| 194 | 
            +
                    assert_equal 6, User.where(@name.idoes_not_match('L%')).count
         | 
| 195 | 
            +
                  end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                  def test_replace
         | 
| 198 | 
            +
                    assert_equal "LucaX", t(@lucas, @name.replace("s","X"))
         | 
| 199 | 
            +
                    assert_equal "replace", t(@lucas, @name.replace(@name,"replace"))
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                  def test_soundex
         | 
| 203 | 
            +
                    if (!$sqlite || !$load_extension_disabled) && (ENV['DB'] != 'postgresql')
         | 
| 204 | 
            +
                      assert_equal "C540", t(@camille, @name.soundex)
         | 
| 205 | 
            +
                      assert_equal 8, User.where(@name.soundex.eq(@name.soundex)).count
         | 
| 206 | 
            +
                    end
         | 
| 207 | 
            +
                  end
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                  def test_trim
         | 
| 210 | 
            +
                    assert_equal "Myun", t(@myung, @name.rtrim("g"))
         | 
| 211 | 
            +
                    assert_equal "yung", t(@myung, @name.ltrim("M"))
         | 
| 212 | 
            +
                    assert_equal "yung", t(@myung, (@name + "M").trim("M"))
         | 
| 213 | 
            +
                    assert_equal "", t(@myung, @name.rtrim(@name))
         | 
| 214 | 
            +
                  end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                  def test_coalesce
         | 
| 217 | 
            +
                    if ENV['DB'] == 'postgresql'
         | 
| 218 | 
            +
                      assert_equal 100, t(@test, @age.coalesce(100))
         | 
| 219 | 
            +
                      assert_equal "Camille", t(@camille, @name.coalesce(nil, "default"))
         | 
| 220 | 
            +
                      assert_equal 20, t(@test, @age.coalesce(nil, 20))
         | 
| 221 | 
            +
                    else
         | 
| 222 | 
            +
                      assert_equal "Camille", t(@camille, @name.coalesce(nil, '20'))
         | 
| 223 | 
            +
                      assert_equal 20, t(@test, @age.coalesce(nil, 20))
         | 
| 224 | 
            +
                    end
         | 
| 225 | 
            +
                  end
         | 
| 226 | 
            +
             | 
| 227 | 
            +
                  def test_comparator
         | 
| 228 | 
            +
                    assert_equal 2, User.where(@age < 6).count
         | 
| 229 | 
            +
                    assert_equal 2, User.where(@age <= 10).count
         | 
| 230 | 
            +
                    assert_equal 3, User.where(@age > 20).count
         | 
| 231 | 
            +
                    assert_equal 4, User.where(@age >= 20).count
         | 
| 232 | 
            +
                    assert_equal 1, User.where(@age > 5).where(@age < 20).count
         | 
| 233 | 
            +
                  end
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                  def test_date_duration
         | 
| 236 | 
            +
                    #Year
         | 
| 237 | 
            +
                    assert_equal 2016, @lucas.select((User.arel_table[:created_at].year).as("res")).first.res.to_i
         | 
| 238 | 
            +
                    assert_equal 0, User.where(@created_at.year.eq("2012")).count
         | 
| 239 | 
            +
                    #Month
         | 
| 240 | 
            +
                    assert_equal 5, @camille.select((User.arel_table[:created_at].month).as("res")).first.res.to_i
         | 
| 241 | 
            +
                    assert_equal 8,User.where(User.arel_table[:created_at].month.eq("05")).count
         | 
| 242 | 
            +
                    #Week
         | 
| 243 | 
            +
                    assert_equal 21,User.where(User.arel_table[:name].eq("Arthur")).select((User.arel_table[:created_at].week).as("res")).first.res.to_i
         | 
| 244 | 
            +
                    assert_equal 8,User.where(User.arel_table[:created_at].month.eq("05")).count
         | 
| 245 | 
            +
                    #Day
         | 
| 246 | 
            +
                    assert_equal 23,User.where(User.arel_table[:name].eq("Laure")).select((User.arel_table[:created_at].day).as("res")).first.res.to_i
         | 
| 247 | 
            +
                    assert_equal 0,User.where(User.arel_table[:created_at].day.eq("05")).count
         | 
| 248 | 
            +
                  end
         | 
| 249 | 
            +
             | 
| 250 | 
            +
             | 
| 251 | 
            +
                  def test_is_null
         | 
| 252 | 
            +
                    assert_equal "Test", User.where(@age.is_null).select(@name).first.name
         | 
| 253 | 
            +
                  end
         | 
| 254 | 
            +
             | 
| 255 | 
            +
             | 
| 256 | 
            +
                  def test_math_plus
         | 
| 257 | 
            +
                    d = Date.new(1997, 6, 15)
         | 
| 258 | 
            +
                    #Concat String
         | 
| 259 | 
            +
                    assert_equal "SophiePhan", t(@sophie, @name + "Phan")
         | 
| 260 | 
            +
                    assert_equal "Sophie2", t(@sophie, @name + 2)
         | 
| 261 | 
            +
                    assert_equal "Sophie1997-06-15", t(@sophie, @name + d)
         | 
| 262 | 
            +
                    assert_equal "Sophie15", t(@sophie, @name + @age)
         | 
| 263 | 
            +
                    assert_equal "SophieSophie", t(@sophie, @name + @name)
         | 
| 264 | 
            +
                    assert_equal "Sophie2016-05-23", t(@sophie, @name + @created_at)
         | 
| 265 | 
            +
                    #concat Integer
         | 
| 266 | 
            +
                    assert_equal 1, User.where((@age + 10).eq(33)).count
         | 
| 267 | 
            +
                    assert_equal 1, User.where((@age + "1").eq(6)).count
         | 
| 268 | 
            +
                    assert_equal 1, User.where((@age + @age).eq(10)).count
         | 
| 269 | 
            +
                    #concat Date
         | 
| 270 | 
            +
                #    puts((User.arel_table[:created_at] + 1).as("res").to_sql.inspect)
         | 
| 271 | 
            +
                    assert_equal "2016-05-24", t(@myung, @created_at + 1).to_date.to_s
         | 
| 272 | 
            +
                    assert_equal "2016-05-25", t(@myung, @created_at + 2.day).to_date.to_s
         | 
| 273 | 
            +
                  end
         | 
| 274 | 
            +
             | 
| 275 | 
            +
             | 
| 276 | 
            +
                  def test_math_moins
         | 
| 277 | 
            +
                    d = Date.new(2016,05,20)
         | 
| 278 | 
            +
                    #Datediff
         | 
| 279 | 
            +
                    assert_equal 8, User.where((User.arel_table[:created_at] - User.arel_table[:created_at]).eq(0)).count
         | 
| 280 | 
            +
                    assert_equal 3, User.where(User.arel_table[:name].eq("Laure")).select((User.arel_table[:created_at] - d).as("res")).first.res.abs.to_i
         | 
| 281 | 
            +
                    #Substraction
         | 
| 282 | 
            +
                    assert_equal 0, User.where((@age - 10).eq(50)).count
         | 
| 283 | 
            +
                    assert_equal 0, User.where((@age - "10").eq(50)).count
         | 
| 284 | 
            +
                  end
         | 
| 285 | 
            +
             | 
| 286 | 
            +
                  def test_wday
         | 
| 287 | 
            +
                    d = Date.new(2016, 6, 26)
         | 
| 288 | 
            +
                    assert_equal 1, t(@myung, @created_at.wday).to_i
         | 
| 289 | 
            +
                    assert_equal 0, User.select(d.wday).as("res").first.to_i
         | 
| 290 | 
            +
                  end
         | 
| 291 | 
            +
             | 
| 292 | 
            +
                end
         | 
| 293 | 
            +
              end
         | 
| 294 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            require 'helper'
         | 
| 2 | 
            +
            require 'date'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module ArelExtensions
         | 
| 5 | 
            +
              module WthAr
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                class InsertManagerTest < Minitest::Test
         | 
| 8 | 
            +
                  def setup_db
         | 
| 9 | 
            +
                    ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
         | 
| 10 | 
            +
                    ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
         | 
| 11 | 
            +
                    ActiveRecord::Base.default_timezone = :utc
         | 
| 12 | 
            +
                    @cnx = ActiveRecord::Base.connection
         | 
| 13 | 
            +
                    Arel::Table.engine = ActiveRecord::Base
         | 
| 14 | 
            +
                    if File.exist?("init/#{ENV['DB']}.sql")
         | 
| 15 | 
            +
                      sql = File.read("init/#{ENV['DB']}.sql")
         | 
| 16 | 
            +
                      @cnx.execute(sql) unless sql.blank?
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                    @cnx.drop_table(:users) rescue nil 
         | 
| 19 | 
            +
                    @cnx.create_table :users do |t|
         | 
| 20 | 
            +
                      t.column :age, :integer
         | 
| 21 | 
            +
                      t.column :name, :string
         | 
| 22 | 
            +
                      t.column :comments, :text
         | 
| 23 | 
            +
                      t.column :created_at, :date
         | 
| 24 | 
            +
                      t.column :updated_at, :datetime
         | 
| 25 | 
            +
                      t.column :score, :decimal, :precision => 20, :scale => 10
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def setup
         | 
| 30 | 
            +
                    setup_db
         | 
| 31 | 
            +
                    @table = Arel::Table.new(:users)
         | 
| 32 | 
            +
                    @cols = ['id', 'name', 'comments', 'created_at']
         | 
| 33 | 
            +
                    @data = [
         | 
| 34 | 
            +
                      [23, 'nom1', "sdfdsfdsfsdfsd fdsf dsf dsf sdf afdg fsdg sg sd gsdfg e 54435 344", '2016-01-01'],
         | 
| 35 | 
            +
                      [25, 'nom2', "sdfdsfdsfsdf", '2016-01-01']
         | 
| 36 | 
            +
                    ]
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  def teardown
         | 
| 40 | 
            +
                    @cnx.drop_table(:users)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # Math Functions
         | 
| 44 | 
            +
                  def test_bulk_insert
         | 
| 45 | 
            +
                    insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
         | 
| 46 | 
            +
                    insert_manager.bulk_insert(@cols, @data)
         | 
| 47 | 
            +
                    @cnx.execute(insert_manager.to_sql)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -11,7 +11,8 @@ module ArelExtensions | |
| 11 11 | 
             
                    ActiveRecord::Base.default_timezone = :utc
         | 
| 12 12 | 
             
                    @cnx = ActiveRecord::Base.connection
         | 
| 13 13 | 
             
                    Arel::Table.engine = ActiveRecord::Base
         | 
| 14 | 
            -
                    @cnx.drop_table(:users) rescue nil | 
| 14 | 
            +
                    @cnx.drop_table(:users) rescue nil
         | 
| 15 | 
            +
                    @cnx.drop_table(:products) rescue nil 
         | 
| 15 16 | 
             
                    @cnx.create_table :users do |t|
         | 
| 16 17 | 
             
                      t.column :age, :integer
         | 
| 17 18 | 
             
                      t.column :name, :string
         | 
| @@ -38,7 +39,7 @@ module ArelExtensions | |
| 38 39 | 
             
                    insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
         | 
| 39 40 | 
             
                    insert_manager.bulk_insert(@cols, @data)
         | 
| 40 41 | 
             
                    sql = insert_manager.to_sql
         | 
| 41 | 
            -
                    sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")  | 
| 42 | 
            +
                    sql.must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at") SELECT 23 AS 'id', 'nom1' AS 'name', 'sdfdsfdsfsdf' AS 'comments', '2016-01-01' AS 'created_at' UNION ALL SELECT 25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
         | 
| 42 43 | 
             
                  end
         | 
| 43 44 |  | 
| 44 45 | 
             
                end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: arel_extensions
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.8. | 
| 4 | 
            +
              version: 0.8.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yann Azoury
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2016-08- | 
| 13 | 
            +
            date: 2016-08-31 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: arel
         | 
| @@ -81,6 +81,9 @@ extra_rdoc_files: | |
| 81 81 | 
             
            files:
         | 
| 82 82 | 
             
            - ".gitignore"
         | 
| 83 83 | 
             
            - ".travis.yml"
         | 
| 84 | 
            +
            - ".travis/oracle/download.js"
         | 
| 85 | 
            +
            - ".travis/oracle/download.sh"
         | 
| 86 | 
            +
            - ".travis/oracle/install.sh"
         | 
| 84 87 | 
             
            - Gemfile
         | 
| 85 88 | 
             
            - MIT-LICENSE.txt
         | 
| 86 89 | 
             
            - README.md
         | 
| @@ -112,7 +115,7 @@ files: | |
| 112 115 | 
             
            - lib/arel_extensions/nodes/find_in_set.rb
         | 
| 113 116 | 
             
            - lib/arel_extensions/nodes/floor.rb
         | 
| 114 117 | 
             
            - lib/arel_extensions/nodes/function.rb
         | 
| 115 | 
            -
            - lib/arel_extensions/nodes/ | 
| 118 | 
            +
            - lib/arel_extensions/nodes/is_null.rb
         | 
| 116 119 | 
             
            - lib/arel_extensions/nodes/length.rb
         | 
| 117 120 | 
             
            - lib/arel_extensions/nodes/locate.rb
         | 
| 118 121 | 
             
            - lib/arel_extensions/nodes/ltrim.rb
         | 
| @@ -146,10 +149,11 @@ files: | |
| 146 149 | 
             
            - test/visitors/test_bulk_insert_to_sql.rb
         | 
| 147 150 | 
             
            - test/visitors/test_oracle.rb
         | 
| 148 151 | 
             
            - test/visitors/test_to_sql.rb
         | 
| 152 | 
            +
            - test/with_ar/all_agnostic_test.rb
         | 
| 153 | 
            +
            - test/with_ar/insert_agnostic_test.rb
         | 
| 149 154 | 
             
            - test/with_ar/test_bulk_sqlite.rb
         | 
| 150 155 | 
             
            - test/with_ar/test_math_sqlite.rb
         | 
| 151 156 | 
             
            - test/with_ar/test_string_mysql.rb
         | 
| 152 | 
            -
            - test/with_ar/test_string_postgresql.rb
         | 
| 153 157 | 
             
            - test/with_ar/test_string_sqlite.rb
         | 
| 154 158 | 
             
            homepage: https://github.com/Faveod/arel-extensions
         | 
| 155 159 | 
             
            licenses:
         | 
| @@ -188,8 +192,9 @@ test_files: | |
| 188 192 | 
             
            - test/visitors/test_bulk_insert_to_sql.rb
         | 
| 189 193 | 
             
            - test/visitors/test_oracle.rb
         | 
| 190 194 | 
             
            - test/visitors/test_to_sql.rb
         | 
| 195 | 
            +
            - test/with_ar/all_agnostic_test.rb
         | 
| 196 | 
            +
            - test/with_ar/insert_agnostic_test.rb
         | 
| 191 197 | 
             
            - test/with_ar/test_bulk_sqlite.rb
         | 
| 192 198 | 
             
            - test/with_ar/test_math_sqlite.rb
         | 
| 193 199 | 
             
            - test/with_ar/test_string_mysql.rb
         | 
| 194 | 
            -
            - test/with_ar/test_string_postgresql.rb
         | 
| 195 200 | 
             
            - test/with_ar/test_string_sqlite.rb
         | 
| @@ -1,30 +0,0 @@ | |
| 1 | 
            -
            module ArelExtensions
         | 
| 2 | 
            -
              module Nodes
         | 
| 3 | 
            -
                class Isnull < Arel::Nodes::Function
         | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def initialize left, right, aliaz = nil
         | 
| 7 | 
            -
                    tab = Array.new
         | 
| 8 | 
            -
                    tab << left
         | 
| 9 | 
            -
                    tab << right
         | 
| 10 | 
            -
                    super(tab, aliaz)
         | 
| 11 | 
            -
                  end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
                  def left
         | 
| 15 | 
            -
                    @expressions.first
         | 
| 16 | 
            -
                  end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
                  def right
         | 
| 20 | 
            -
                    @expressions[1]
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def as other
         | 
| 25 | 
            -
                    Arel::Nodes::As.new self, Arel::Nodes::SqlLiteral.new(other)
         | 
| 26 | 
            -
                  end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
            end
         | 
| @@ -1,81 +0,0 @@ | |
| 1 | 
            -
            require 'helper'
         | 
| 2 | 
            -
            require 'date'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            module ArelExtensions
         | 
| 5 | 
            -
              module WthAr
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                describe 'the postgresql visitor can do string operations' do
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                  before do
         | 
| 10 | 
            -
                    ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
         | 
| 11 | 
            -
                    ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-postgres" : :postgres))
         | 
| 12 | 
            -
                    ActiveRecord::Base.default_timezone = :utc
         | 
| 13 | 
            -
                    begin 
         | 
| 14 | 
            -
                      @cnx = ActiveRecord::Base.connection
         | 
| 15 | 
            -
                    rescue => e
         | 
| 16 | 
            -
                      puts "\n#{e.inspect}"
         | 
| 17 | 
            -
                      ActiveRecord::Base.establish_connection(ENV['DB'] || :sqlite)
         | 
| 18 | 
            -
                      @cnx = ActiveRecord::Base.connection
         | 
| 19 | 
            -
                    end
         | 
| 20 | 
            -
                    Arel::Table.engine = ActiveRecord::Base
         | 
| 21 | 
            -
                    @cnx.drop_table(:users) rescue nil 
         | 
| 22 | 
            -
                    @cnx.drop_table(:products) rescue nil 
         | 
| 23 | 
            -
                    @cnx.create_table :users do |t|
         | 
| 24 | 
            -
                      t.column :age, :integer
         | 
| 25 | 
            -
                      t.column :name, :string
         | 
| 26 | 
            -
                      t.column :comments, :text
         | 
| 27 | 
            -
                      t.column :created_at, :date
         | 
| 28 | 
            -
                      t.column :updated_at, :date
         | 
| 29 | 
            -
                      t.column :score, :decimal
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
                    @cnx.create_table :products do |t|
         | 
| 32 | 
            -
                      t.column :price, :decimal
         | 
| 33 | 
            -
                    end
         | 
| 34 | 
            -
                    class User < ActiveRecord::Base
         | 
| 35 | 
            -
                    end
         | 
| 36 | 
            -
                    d = Date.new(2016, 5,23)
         | 
| 37 | 
            -
                    lucas = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
         | 
| 38 | 
            -
                    @lucas = User.where(:id => lucas.id)
         | 
| 39 | 
            -
                    sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
         | 
| 40 | 
            -
                    @sophie = User.where(:id => sophie.id)
         | 
| 41 | 
            -
                    User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
         | 
| 42 | 
            -
                    User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
         | 
| 43 | 
            -
                    User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
         | 
| 44 | 
            -
                    @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
         | 
| 45 | 
            -
                    User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
         | 
| 46 | 
            -
                    @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
         | 
| 47 | 
            -
                    @table = Arel::Table.new(:users)
         | 
| 48 | 
            -
                    @name = @table[:name]
         | 
| 49 | 
            -
                    @age = @table[:age]
         | 
| 50 | 
            -
                  end
         | 
| 51 | 
            -
                  after do
         | 
| 52 | 
            -
                    @cnx.drop_table(:users)
         | 
| 53 | 
            -
                  end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                  it "should do string operations" do
         | 
| 56 | 
            -
                    # concat
         | 
| 57 | 
            -
                    d = Date.new(1997, 6, 15)
         | 
| 58 | 
            -
                    assert_equal "SophiePhan", @sophie.select((@name + "Phan").as("res")).first.res
         | 
| 59 | 
            -
                    assert_equal "Sophie2", @sophie.select((@name + 2).as("res")).first.res
         | 
| 60 | 
            -
                    assert_equal "Sophie1997-06-15", @sophie.select((@name + d).as("res")).first.res
         | 
| 61 | 
            -
                    assert_equal "Sophie15", @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
         | 
| 62 | 
            -
                    assert_equal "SophieSophie", @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
         | 
| 63 | 
            -
                    assert_equal "Sophie2016-05-23", @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as("res")).first.res
         | 
| 64 | 
            -
                    #concat Integer
         | 
| 65 | 
            -
                    assert_equal 1, User.where((@age + 10).eq(33)).count
         | 
| 66 | 
            -
                    assert_equal 6, @lucas.select((@age + "1").as('res')).first.res.to_i
         | 
| 67 | 
            -
                    assert_equal 1, @sophie.where(@age>14).where(@age<16).count
         | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
                    # Replace
         | 
| 72 | 
            -
                    assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
         | 
| 73 | 
            -
                    assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                    # 
         | 
| 76 | 
            -
                  end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
              end
         | 
| 81 | 
            -
            end
         |