sequel 4.1.1 → 4.2.0

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