File: column_select_spec.rb

package info (click to toggle)
ruby-sequel 5.63.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,408 kB
  • sloc: ruby: 113,747; makefile: 3
file content (129 lines) | stat: -rw-r--r-- 5,360 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
require_relative "spec_helper"

describe "Sequel::Plugins::ColumnSelect" do
  def set_cols(*cols)
    @cols.replace(cols)
  end

  before do
    cols = @cols = []
    @db = Sequel.mock
    @db.extend_datasets(Module.new{define_method(:columns){cols}})
    set_cols :id, :a, :b, :c
    @Album = Class.new(Sequel::Model(@db[:albums]))
  end

  it "should add a explicit column selections to existing dataset without explicit selection" do
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT albums.id, albums.a, albums.b, albums.c FROM albums'

    @Album.dataset = :albs
    @Album.dataset.sql.must_equal 'SELECT albs.id, albs.a, albs.b, albs.c FROM albs'

    @Album.dataset = Sequel.identifier(:albs)
    @Album.dataset.sql.must_equal 'SELECT albs.id, albs.a, albs.b, albs.c FROM albs'
  end

  with_symbol_splitting "should handle splittable symbols" do
    @Album.dataset = :s__albums
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT s.albums.id, s.albums.a, s.albums.b, s.albums.c FROM s.albums'

    @Album.dataset = :albums___a
    @Album.dataset.sql.must_equal 'SELECT a.id, a.a, a.b, a.c FROM albums AS a'

    @Album.dataset = :s__albums___a
    @Album.dataset.sql.must_equal 'SELECT a.id, a.a, a.b, a.c FROM s.albums AS a'
  end

  it "should handle qualified tables" do
    @Album.dataset = Sequel.qualify(:s2, :albums)
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT s2.albums.id, s2.albums.a, s2.albums.b, s2.albums.c FROM s2.albums'
  end

  it "should handle aliases" do
    @Album.plugin :column_select
    @Album.dataset = Sequel.as(:albums, :b)
    @Album.dataset.sql.must_equal 'SELECT b.id, b.a, b.b, b.c FROM albums AS b'

    @Album.dataset = @Album.db[:albums].from_self
    @Album.dataset.sql.must_equal 'SELECT t1.id, t1.a, t1.b, t1.c FROM (SELECT * FROM albums) AS t1'

    @Album.dataset = Sequel.as(@Album.db[:albums], :b)
    @Album.dataset.sql.must_equal 'SELECT b.id, b.a, b.b, b.c FROM (SELECT * FROM albums) AS b'
  end

  it "should not add a explicit column selection selection on existing dataset with explicit selection" do
    @Album.dataset = @Album.dataset.select(:name)
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT name FROM albums'

    @Album.dataset = @Album.dataset.select(:name, :artist)
    @Album.dataset.sql.must_equal 'SELECT name, artist FROM albums'
  end

  it "should work with implicit subqueries used for joined datasets" do
    @Album.dataset = @Album.db.from(:a1, :a2)
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal "SELECT a1.id, a1.a, a1.b, a1.c FROM (SELECT * FROM a1, a2) AS a1"

    @Album.dataset = @Album.db.from(:a1).cross_join(:a2)
    @Album.dataset.sql.must_equal "SELECT a1.id, a1.a, a1.b, a1.c FROM (SELECT * FROM a1 CROSS JOIN a2) AS a1"
  end

  it "should add a explicit column selection on existing dataset with a subquery" do
    @Album.dataset = @Album.db.from(:a1, :a2).from_self(:alias=>:foo)
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT foo.id, foo.a, foo.b, foo.c FROM (SELECT * FROM a1, a2) AS foo'

    @Album.dataset = @Album.db.from(:a1).cross_join(:a2).from_self(:alias=>:foo)
    @Album.dataset.sql.must_equal 'SELECT foo.id, foo.a, foo.b, foo.c FROM (SELECT * FROM a1 CROSS JOIN a2) AS foo'
  end

  it "should use explicit column selection for many_to_many associations" do
    @Album.plugin :column_select
    @Album.many_to_many :albums, :class=>@Album, :left_key=>:l, :right_key=>:r, :join_table=>:j
    @Album.load(:id=>1).albums_dataset.sql.must_equal 'SELECT albums.id, albums.a, albums.b, albums.c FROM albums INNER JOIN j ON (j.r = albums.id) WHERE (j.l = 1)'
  end

  it "should set not explicit column selection for many_to_many associations when overriding select" do
    @Album.plugin :column_select
    @Album.dataset = @Album.dataset.select(:a)
    @Album.many_to_many :albums, :class=>@Album, :left_key=>:l, :right_key=>:r, :join_table=>:j
    @Album.load(:id=>1).albums_dataset.sql.must_equal 'SELECT albums.* FROM albums INNER JOIN j ON (j.r = albums.id) WHERE (j.l = 1)'
  end

  it "should use the schema to get columns if available" do
    def @db.supports_schema_parsing?() true end
    def @db.schema(t, *)
      [[:t, {}], [:d, {}]]
    end
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT albums.t, albums.d FROM albums'
  end

  it "should handle case where schema parsing does not produce results" do
    def @db.supports_schema_parsing?() true end
    def @db.schema_parse_table(t, *) [] end
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT albums.id, albums.a, albums.b, albums.c FROM albums'
  end

  it "should handle case where schema parsing and columns does not produce results" do
    def @db.supports_schema_parsing?() true end
    def @db.schema_parse_table(t, *) [] end
    @db.extend_datasets{def columns; raise Sequel::DatabaseError; end}
    @Album.require_valid_table = false
    @Album.plugin :column_select
    @Album.dataset.sql.must_equal 'SELECT * FROM albums'
  end

  it "works correctly when loaded on model without a dataset" do
    c = Class.new(Sequel::Model)
    c.plugin :column_select
    sc = Class.new(c)
    sc.dataset = @db[:a]
    sc.dataset.sql.must_equal "SELECT a.id, a.a, a.b, a.c FROM a"
  end
end