sequel 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +32 -0
  3. data/doc/opening_databases.rdoc +4 -0
  4. data/doc/release_notes/4.2.0.txt +129 -0
  5. data/lib/sequel/adapters/jdbc/hsqldb.rb +5 -0
  6. data/lib/sequel/adapters/mysql2.rb +2 -1
  7. data/lib/sequel/adapters/postgres.rb +8 -4
  8. data/lib/sequel/adapters/shared/db2.rb +5 -0
  9. data/lib/sequel/adapters/shared/mssql.rb +15 -4
  10. data/lib/sequel/adapters/shared/mysql.rb +1 -0
  11. data/lib/sequel/adapters/shared/oracle.rb +1 -1
  12. data/lib/sequel/adapters/shared/postgres.rb +10 -0
  13. data/lib/sequel/adapters/shared/sqlite.rb +5 -0
  14. data/lib/sequel/database/features.rb +6 -1
  15. data/lib/sequel/database/schema_methods.rb +3 -7
  16. data/lib/sequel/dataset/actions.rb +3 -4
  17. data/lib/sequel/dataset/features.rb +5 -0
  18. data/lib/sequel/dataset/misc.rb +28 -3
  19. data/lib/sequel/dataset/mutation.rb +37 -11
  20. data/lib/sequel/dataset/prepared_statements.rb +1 -3
  21. data/lib/sequel/dataset/query.rb +12 -3
  22. data/lib/sequel/dataset/sql.rb +12 -6
  23. data/lib/sequel/deprecated.rb +1 -1
  24. data/lib/sequel/extensions/columns_introspection.rb +1 -1
  25. data/lib/sequel/extensions/core_extensions.rb +0 -2
  26. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +1 -1
  27. data/lib/sequel/extensions/filter_having.rb +1 -1
  28. data/lib/sequel/extensions/from_block.rb +31 -0
  29. data/lib/sequel/extensions/graph_each.rb +1 -1
  30. data/lib/sequel/extensions/hash_aliases.rb +1 -1
  31. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +78 -0
  32. data/lib/sequel/extensions/pagination.rb +1 -1
  33. data/lib/sequel/extensions/pg_loose_count.rb +32 -0
  34. data/lib/sequel/extensions/pg_static_cache_updater.rb +133 -0
  35. data/lib/sequel/extensions/pretty_table.rb +1 -1
  36. data/lib/sequel/extensions/query.rb +3 -1
  37. data/lib/sequel/extensions/query_literals.rb +1 -1
  38. data/lib/sequel/extensions/select_remove.rb +1 -1
  39. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +1 -1
  40. data/lib/sequel/extensions/set_overrides.rb +1 -1
  41. data/lib/sequel/model.rb +1 -1
  42. data/lib/sequel/model/base.rb +20 -6
  43. data/lib/sequel/model/exceptions.rb +1 -1
  44. data/lib/sequel/plugins/composition.rb +9 -0
  45. data/lib/sequel/plugins/dirty.rb +19 -8
  46. data/lib/sequel/plugins/instance_filters.rb +9 -0
  47. data/lib/sequel/plugins/serialization.rb +9 -0
  48. data/lib/sequel/plugins/serialization_modification_detection.rb +9 -0
  49. data/lib/sequel/plugins/static_cache.rb +96 -28
  50. data/lib/sequel/version.rb +2 -2
  51. data/spec/adapters/mssql_spec.rb +1 -1
  52. data/spec/adapters/postgres_spec.rb +70 -0
  53. data/spec/core/dataset_spec.rb +58 -1
  54. data/spec/core/deprecated_spec.rb +1 -1
  55. data/spec/core/schema_spec.rb +18 -0
  56. data/spec/extensions/composition_spec.rb +7 -0
  57. data/spec/extensions/dirty_spec.rb +9 -0
  58. data/spec/extensions/from_block_spec.rb +21 -0
  59. data/spec/extensions/instance_filters_spec.rb +6 -0
  60. data/spec/extensions/pg_loose_count_spec.rb +17 -0
  61. data/spec/extensions/pg_static_cache_updater_spec.rb +80 -0
  62. data/spec/extensions/query_spec.rb +8 -0
  63. data/spec/extensions/serialization_modification_detection_spec.rb +9 -0
  64. data/spec/extensions/serialization_spec.rb +7 -0
  65. data/spec/extensions/set_overrides_spec.rb +12 -0
  66. data/spec/extensions/static_cache_spec.rb +314 -154
  67. data/spec/integration/dataset_test.rb +12 -2
  68. data/spec/integration/schema_test.rb +13 -0
  69. data/spec/model/record_spec.rb +74 -0
  70. metadata +13 -3
@@ -59,6 +59,16 @@ describe "Simple Dataset operations" do
59
59
  @ds.join(:items___b, :id=>:id).select_all(:items).all.should == [{:id=>1, :number=>10}]
60
60
  end
61
61
 
62
+ specify "should handle LATERAL subqueries correctly" do
63
+ @ds << {:number=>20}
64
+ @ds.from(:items___i, @ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
65
+ @ds.from(:items___i).cross_join(@ds.where(:items__number=>:i__number).lateral).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
66
+ @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
67
+ @ds.from(:items___i).join(@ds.where(:items__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).should == []
68
+ @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>1).select_order_map([:i__number___n, :t1__number]).should == [[10, 10], [20, 20]]
69
+ @ds.from(:items___i).left_join(@ds.from(:items___i2).where(:i2__number=>:i__number).lateral, 1=>0).select_order_map([:i__number___n, :t1__number]).should == [[10, nil], [20, nil]]
70
+ end if DB.dataset.supports_lateral_subqueries?
71
+
62
72
  specify "should correctly deal with qualified columns and subselects" do
63
73
  @ds.from_self(:alias=>:a).select(:a__id, Sequel.qualify(:a, :number)).all.should == [{:id=>1, :number=>10}]
64
74
  @ds.join(@ds.as(:a), :id=>:id).select(:a__id, Sequel.qualify(:a, :number)).all.should == [{:id=>1, :number=>10}]
@@ -568,9 +578,9 @@ if DB.dataset.supports_cte?
568
578
  end
569
579
 
570
580
  cspecify "should give correct results for recursive WITH", :db2 do
571
- ds = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>nil), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi])
581
+ ds = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>nil), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi]).order(:id)
572
582
  ds.all.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>nil, :id=>2}, {:parent_id=>1, :id=>3}, {:parent_id=>1, :id=>4}, {:parent_id=>3, :id=>5}, {:parent_id=>5, :id=>6}]
573
- ps = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>:$n), @ds.join(:t, :i=>:parent_id).filter(:t__i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi]).prepare(:select, :cte_sel)
583
+ ps = @db[:t].select(:i___id, :pi___parent_id).with_recursive(:t, @ds.filter(:parent_id=>:$n), @ds.join(:t, :i=>:parent_id).filter(:t__i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi]).order(:id).prepare(:select, :cte_sel)
574
584
  ps.call(:n=>1).should == [{:id=>3, :parent_id=>1}, {:id=>4, :parent_id=>1}, {:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
575
585
  ps.call(:n=>3).should == [{:id=>5, :parent_id=>3}, {:id=>6, :parent_id=>5}]
576
586
  ps.call(:n=>5).should == [{:id=>6, :parent_id=>5}]
@@ -175,6 +175,11 @@ describe "Database index parsing" do
175
175
  DB.create_table!(:items){Integer :n; Integer :a; primary_key [:n, :a]}
176
176
  DB.indexes(:items).should == {}
177
177
  end
178
+
179
+ cspecify "should not include partial indexes", :sqlite do
180
+ DB.create_table!(:items){Integer :n; Integer :a; index :n, :where=>proc{n > 10}}
181
+ DB.indexes(:items).should == {}
182
+ end if DB.supports_partial_indexes?
178
183
  end if DB.supports_index_parsing?
179
184
 
180
185
  describe "Database foreign key parsing" do
@@ -352,6 +357,14 @@ describe "Database schema modifiers" do
352
357
  @ds.columns!.should == [:number]
353
358
  end
354
359
 
360
+ specify "should allow creating partial indexes with tables" do
361
+ @db.create_table!(:items){Integer :number; index :number, :where=>proc{number > 10}}
362
+ @db.table_exists?(:items).should == true
363
+ @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:number]
364
+ @ds.insert([10])
365
+ @ds.columns!.should == [:number]
366
+ end if DB.supports_partial_indexes?
367
+
355
368
  specify "should handle combination of default, unique, and not null" do
356
369
  @db.create_table!(:items){Integer :number, :default=>0, :null=>false, :unique=>true}
357
370
  @db.table_exists?(:items).should == true
@@ -406,6 +406,80 @@ describe "Model#freeze" do
406
406
  end
407
407
  end
408
408
 
409
+ describe "Model#dup" do
410
+ before do
411
+ @Album = Class.new(Sequel::Model(:albums))
412
+ @o = @Album.load(:id=>1)
413
+ DB.sqls
414
+ end
415
+
416
+ it "should be equal to existing object" do
417
+ @o.dup.should == @o
418
+ @o.dup.values.should == @o.values
419
+ @o.dup.changed_columns.should == @o.changed_columns
420
+ @o.dup.errors.should == @o.errors
421
+ @o.dup.this.should == @o.this
422
+ end
423
+
424
+ it "should not use identical structures" do
425
+ @o.dup.should_not equal(@o)
426
+ @o.dup.values.should_not equal(@o.values)
427
+ @o.dup.changed_columns.should_not equal(@o.changed_columns)
428
+ @o.dup.errors.should_not equal(@o.errors)
429
+ @o.dup.this.should_not equal(@o.this)
430
+ end
431
+
432
+ it "should keep new status" do
433
+ @o.dup.new?.should be_false
434
+ @Album.new.dup.new?.should be_true
435
+ end
436
+
437
+ it "should not copy frozen status" do
438
+ @o.freeze.dup.should_not be_frozen
439
+ @o.freeze.dup.values.should_not be_frozen
440
+ @o.freeze.dup.changed_columns.should_not be_frozen
441
+ @o.freeze.dup.errors.should_not be_frozen
442
+ @o.freeze.dup.this.should_not be_frozen
443
+ end
444
+ end
445
+
446
+ describe "Model#clone" do
447
+ before do
448
+ @Album = Class.new(Sequel::Model(:albums))
449
+ @o = @Album.load(:id=>1)
450
+ DB.sqls
451
+ end
452
+
453
+ it "should be equal to existing object" do
454
+ @o.clone.should == @o
455
+ @o.clone.values.should == @o.values
456
+ @o.clone.changed_columns.should == @o.changed_columns
457
+ @o.clone.errors.should == @o.errors
458
+ @o.clone.this.should == @o.this
459
+ end
460
+
461
+ it "should not use identical structures" do
462
+ @o.clone.should_not equal(@o)
463
+ @o.clone.values.should_not equal(@o.values)
464
+ @o.clone.changed_columns.should_not equal(@o.changed_columns)
465
+ @o.clone.errors.should_not equal(@o.errors)
466
+ @o.clone.this.should_not equal(@o.this)
467
+ end
468
+
469
+ it "should keep new status" do
470
+ @o.clone.new?.should be_false
471
+ @Album.new.clone.new?.should be_true
472
+ end
473
+
474
+ it "should copy frozen status" do
475
+ @o.freeze.clone.should be_frozen
476
+ @o.freeze.clone.values.should be_frozen
477
+ @o.freeze.clone.changed_columns.should be_frozen
478
+ @o.freeze.clone.errors.should be_frozen
479
+ @o.freeze.clone.this.should be_frozen
480
+ end
481
+ end
482
+
409
483
  describe "Model#marshallable" do
410
484
  before do
411
485
  class ::Album < Sequel::Model
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-01 00:00:00.000000000 Z
11
+ date: 2013-09-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The Database Toolkit for Ruby
14
14
  email: code@jeremyevans.net
@@ -115,6 +115,7 @@ extra_rdoc_files:
115
115
  - doc/release_notes/3.48.0.txt
116
116
  - doc/release_notes/4.0.0.txt
117
117
  - doc/release_notes/4.1.0.txt
118
+ - doc/release_notes/4.2.0.txt
118
119
  files:
119
120
  - MIT-LICENSE
120
121
  - CHANGELOG
@@ -217,6 +218,7 @@ files:
217
218
  - doc/release_notes/3.48.0.txt
218
219
  - doc/release_notes/4.0.0.txt
219
220
  - doc/release_notes/4.1.0.txt
221
+ - doc/release_notes/4.2.0.txt
220
222
  - spec/adapters/firebird_spec.rb
221
223
  - spec/adapters/informix_spec.rb
222
224
  - spec/adapters/mssql_spec.rb
@@ -307,8 +309,11 @@ files:
307
309
  - spec/extensions/pg_array_associations_spec.rb
308
310
  - spec/extensions/schema_caching_spec.rb
309
311
  - spec/extensions/pg_json_ops_spec.rb
312
+ - spec/extensions/from_block_spec.rb
310
313
  - spec/extensions/select_remove_spec.rb
314
+ - spec/extensions/pg_loose_count_spec.rb
311
315
  - spec/extensions/query_literals_spec.rb
316
+ - spec/extensions/pg_static_cache_updater_spec.rb
312
317
  - spec/extensions/pg_inet_spec.rb
313
318
  - spec/extensions/eval_inspect_spec.rb
314
319
  - spec/extensions/pg_range_spec.rb
@@ -555,6 +560,10 @@ files:
555
560
  - lib/sequel/extensions/sequel_3_dataset_methods.rb
556
561
  - lib/sequel/extensions/pg_json_ops.rb
557
562
  - lib/sequel/extensions/empty_array_ignore_nulls.rb
563
+ - lib/sequel/extensions/from_block.rb
564
+ - lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb
565
+ - lib/sequel/extensions/pg_loose_count.rb
566
+ - lib/sequel/extensions/pg_static_cache_updater.rb
558
567
  - lib/sequel/version.rb
559
568
  - lib/sequel/model.rb
560
569
  - lib/sequel/model/associations.rb
@@ -628,7 +637,8 @@ files:
628
637
  - lib/sequel/ast_transformer.rb
629
638
  - lib/sequel/no_core_ext.rb
630
639
  homepage: http://sequel.rubyforge.org
631
- licenses: []
640
+ licenses:
641
+ - MIT
632
642
  metadata: {}
633
643
  post_install_message:
634
644
  rdoc_options: