sequel_impala 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +50 -0
- data/LICENSE +463 -0
- data/README.md +45 -0
- data/Rakefile +39 -0
- data/lib/driver/commons-collections-3.2.1.jar +0 -0
- data/lib/driver/commons-configuration-1.10.jar +0 -0
- data/lib/driver/commons-logging-1.2.jar +0 -0
- data/lib/driver/hadoop-auth-2.9.0.jar +0 -0
- data/lib/driver/hadoop-common-2.9.0.jar +0 -0
- data/lib/driver/hadoop-core-2.6.0.jar +0 -0
- data/lib/driver/hive-exec-1.1.0.jar +0 -0
- data/lib/driver/hive-jdbc-1.1.0.jar +0 -0
- data/lib/driver/hive-metastore-1.1.0.jar +0 -0
- data/lib/driver/hive-service-1.1.0.jar +0 -0
- data/lib/driver/httpclient-4.3.jar +0 -0
- data/lib/driver/httpcore-4.3.jar +0 -0
- data/lib/driver/libfb303-0.9.0.jar +0 -0
- data/lib/driver/log4j-1.2.17.jar +0 -0
- data/lib/driver/slf4j-api-1.7.5.jar +0 -0
- data/lib/driver/stax2-api-3.1.4.jar +0 -0
- data/lib/driver/woodstox-core-asl-4.4.1.jar +0 -0
- data/lib/impala.rb +55 -0
- data/lib/impala/connection.rb +180 -0
- data/lib/impala/cursor.rb +200 -0
- data/lib/impala/progress_reporter.rb +40 -0
- data/lib/impala/protocol.rb +8 -0
- data/lib/impala/protocol/beeswax_constants.rb +15 -0
- data/lib/impala/protocol/beeswax_service.rb +747 -0
- data/lib/impala/protocol/beeswax_types.rb +193 -0
- data/lib/impala/protocol/exec_stats_constants.rb +13 -0
- data/lib/impala/protocol/exec_stats_types.rb +133 -0
- data/lib/impala/protocol/facebook_service.rb +706 -0
- data/lib/impala/protocol/fb303_constants.rb +15 -0
- data/lib/impala/protocol/fb303_types.rb +25 -0
- data/lib/impala/protocol/hive_metastore_constants.rb +53 -0
- data/lib/impala/protocol/hive_metastore_types.rb +698 -0
- data/lib/impala/protocol/impala_hive_server2_service.rb +137 -0
- data/lib/impala/protocol/impala_service.rb +443 -0
- data/lib/impala/protocol/impala_service_constants.rb +13 -0
- data/lib/impala/protocol/impala_service_types.rb +192 -0
- data/lib/impala/protocol/status_constants.rb +13 -0
- data/lib/impala/protocol/status_types.rb +46 -0
- data/lib/impala/protocol/t_c_l_i_service.rb +1108 -0
- data/lib/impala/protocol/t_c_l_i_service_constants.rb +72 -0
- data/lib/impala/protocol/t_c_l_i_service_types.rb +1802 -0
- data/lib/impala/protocol/thrift_hive_metastore.rb +4707 -0
- data/lib/impala/protocol/types_constants.rb +13 -0
- data/lib/impala/protocol/types_types.rb +332 -0
- data/lib/impala/sasl_transport.rb +117 -0
- data/lib/impala/thrift_patch.rb +31 -0
- data/lib/impala/version.rb +3 -0
- data/lib/jdbc/hive2.rb +52 -0
- data/lib/jdbc/impala.rb +50 -0
- data/lib/rbhive.rb +8 -0
- data/lib/rbhive/connection.rb +150 -0
- data/lib/rbhive/explain_result.rb +46 -0
- data/lib/rbhive/result_set.rb +37 -0
- data/lib/rbhive/schema_definition.rb +86 -0
- data/lib/rbhive/t_c_l_i_connection.rb +466 -0
- data/lib/rbhive/t_c_l_i_result_set.rb +3 -0
- data/lib/rbhive/t_c_l_i_schema_definition.rb +87 -0
- data/lib/rbhive/table_schema.rb +122 -0
- data/lib/rbhive/version.rb +3 -0
- data/lib/sequel/adapters/impala.rb +220 -0
- data/lib/sequel/adapters/jdbc/hive2.rb +36 -0
- data/lib/sequel/adapters/jdbc/impala.rb +38 -0
- data/lib/sequel/adapters/rbhive.rb +177 -0
- data/lib/sequel/adapters/shared/impala.rb +808 -0
- data/lib/sequel/extensions/csv_to_parquet.rb +166 -0
- data/lib/thrift/facebook_service.rb +700 -0
- data/lib/thrift/fb303_constants.rb +9 -0
- data/lib/thrift/fb303_types.rb +19 -0
- data/lib/thrift/hive_metastore_constants.rb +41 -0
- data/lib/thrift/hive_metastore_types.rb +630 -0
- data/lib/thrift/hive_service_constants.rb +13 -0
- data/lib/thrift/hive_service_types.rb +72 -0
- data/lib/thrift/queryplan_constants.rb +13 -0
- data/lib/thrift/queryplan_types.rb +261 -0
- data/lib/thrift/sasl_client_transport.rb +161 -0
- data/lib/thrift/serde_constants.rb +92 -0
- data/lib/thrift/serde_types.rb +7 -0
- data/lib/thrift/t_c_l_i_service.rb +1054 -0
- data/lib/thrift/t_c_l_i_service_constants.rb +72 -0
- data/lib/thrift/t_c_l_i_service_types.rb +1768 -0
- data/lib/thrift/thrift_hive.rb +508 -0
- data/lib/thrift/thrift_hive_metastore.rb +3856 -0
- data/spec/database_test.rb +56 -0
- data/spec/dataset_test.rb +1268 -0
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +4 -0
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +4 -0
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +9 -0
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +9 -0
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +3 -0
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +4 -0
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +3 -0
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +9 -0
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +9 -0
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +4 -0
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +9 -0
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +9 -0
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +9 -0
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +9 -0
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +4 -0
- data/spec/files/integer_migrations/001_create_sessions.rb +9 -0
- data/spec/files/integer_migrations/002_create_nodes.rb +9 -0
- data/spec/files/integer_migrations/003_3_create_users.rb +4 -0
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +9 -0
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +9 -0
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +9 -0
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +9 -0
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +4 -0
- data/spec/files/reversible_migrations/001_reversible.rb +5 -0
- data/spec/files/reversible_migrations/002_reversible.rb +5 -0
- data/spec/files/reversible_migrations/003_reversible.rb +5 -0
- data/spec/files/reversible_migrations/004_reversible.rb +5 -0
- data/spec/files/reversible_migrations/005_reversible.rb +10 -0
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +9 -0
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +9 -0
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +4 -0
- data/spec/impala_test.rb +290 -0
- data/spec/migrator_test.rb +240 -0
- data/spec/plugin_test.rb +91 -0
- data/spec/prepared_statement_test.rb +327 -0
- data/spec/schema_test.rb +356 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/timezone_test.rb +86 -0
- data/spec/type_test.rb +99 -0
- metadata +294 -0
data/spec/impala_test.rb
ADDED
@@ -0,0 +1,290 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
|
+
|
3
|
+
describe "Impala column/table comments and describe" do
|
4
|
+
before do
|
5
|
+
@db = DB
|
6
|
+
end
|
7
|
+
after do
|
8
|
+
@db.drop_table?(:items)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should set table and column comments correctly" do
|
12
|
+
@db.create_table!(:items, :comment=>'tab_com') do
|
13
|
+
Integer :i, :comment=>'col_com'
|
14
|
+
end
|
15
|
+
@db.describe(:items).first[:comment].must_equal 'col_com'
|
16
|
+
@db.describe(:items, :formatted=>true).find{|r| r[:type].to_s.strip == 'comment' && r[:name] == ''}[:comment].strip.must_equal 'tab_com'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Impala dataset" do
|
21
|
+
before do
|
22
|
+
@db = DB
|
23
|
+
@db.create_table!(:items) do
|
24
|
+
Integer :id
|
25
|
+
Integer :number
|
26
|
+
String :name
|
27
|
+
end
|
28
|
+
@ds = @db[:items].order(:id)
|
29
|
+
@ds.insert(1, 10, 'a')
|
30
|
+
end
|
31
|
+
after do
|
32
|
+
@db.drop_table?(:items)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#update should emulate UPDATE" do
|
36
|
+
@ds.update(:number=>20, :name=>'b')
|
37
|
+
@ds.all.must_equal [{:id=>1, :number=>20, :name=>'b'}]
|
38
|
+
@ds.where(:id=>1).update(:number=>30, :name=>'c')
|
39
|
+
@ds.all.must_equal [{:id=>1, :number=>30, :name=>'c'}]
|
40
|
+
@ds.where(:id=>2).update(:number=>40, :name=>'d')
|
41
|
+
@ds.all.must_equal [{:id=>1, :number=>30, :name=>'c'}]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "Impala dataset" do
|
46
|
+
before do
|
47
|
+
@db = DB
|
48
|
+
@db.create_table!(:items){Integer :number}
|
49
|
+
@ds = @db[:items]
|
50
|
+
@ds.insert(1)
|
51
|
+
end
|
52
|
+
after do
|
53
|
+
@db.drop_table?(:items)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "#delete should emulate DELETE" do
|
57
|
+
assert_nil(@ds.where(:number=>2).delete)
|
58
|
+
@ds.count.must_equal 1
|
59
|
+
assert_nil(@ds.where(:number=>1).delete)
|
60
|
+
@ds.count.must_equal 0
|
61
|
+
|
62
|
+
@ds.insert(1)
|
63
|
+
@ds.count.must_equal 1
|
64
|
+
assert_nil(@ds.delete)
|
65
|
+
@ds.count.must_equal 0
|
66
|
+
end
|
67
|
+
|
68
|
+
it "#truncate should emulate TRUNCATE" do
|
69
|
+
assert_nil(@ds.truncate)
|
70
|
+
@ds.count.must_equal 0
|
71
|
+
end
|
72
|
+
|
73
|
+
it "#insert_overwrite should overwrite tables" do
|
74
|
+
@ds.insert_overwrite.insert(2)
|
75
|
+
@ds.select_map(:number).must_equal [2]
|
76
|
+
@ds.insert(4)
|
77
|
+
@ds.select_order_map(:number).must_equal [2, 4]
|
78
|
+
@ds.insert_overwrite.insert(3)
|
79
|
+
@ds.select_map(:number).must_equal [3]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "Impala string comparisons" do
|
84
|
+
before do
|
85
|
+
@db = DB
|
86
|
+
@db.create_table!(:items){String :name}
|
87
|
+
@ds = @db[:items]
|
88
|
+
@ds.insert('m')
|
89
|
+
end
|
90
|
+
after do
|
91
|
+
@db.drop_table?(:items)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should work for equality and inequality" do
|
95
|
+
@ds.where(:name => 'm').all.must_equal [{:name=>'m'}]
|
96
|
+
@ds.where(:name => 'j').all.must_equal []
|
97
|
+
@ds.exclude(:name => 'j').all.must_equal [{:name=>'m'}]
|
98
|
+
@ds.exclude(:name => 'm').all.must_equal []
|
99
|
+
@ds.where{name > 'l'}.all.must_equal [{:name=>'m'}]
|
100
|
+
@ds.where{name > 'm'}.all.must_equal []
|
101
|
+
@ds.where{name < 'n'}.all.must_equal [{:name=>'m'}]
|
102
|
+
@ds.where{name < 'm'}.all.must_equal []
|
103
|
+
@ds.where{name >= 'm'}.all.must_equal [{:name=>'m'}]
|
104
|
+
@ds.where{name >= 'n'}.all.must_equal []
|
105
|
+
@ds.where{name <= 'm'}.all.must_equal [{:name=>'m'}]
|
106
|
+
@ds.where{name <= 'l'}.all.must_equal []
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "Impala date manipulation functions" do
|
111
|
+
before do
|
112
|
+
@db = DB
|
113
|
+
@db.create_table!(:items){Time :t}
|
114
|
+
@ds = @db[:items]
|
115
|
+
@ds.insert(Date.today)
|
116
|
+
end
|
117
|
+
after do
|
118
|
+
@db.drop_table?(:items)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "date_add should work correctly" do
|
122
|
+
@ds.get{date_add(t, 0)}.to_date.must_equal Date.today
|
123
|
+
@ds.get{date_add(t, Sequel.lit('interval 0 days'))}.to_date.must_equal Date.today
|
124
|
+
@ds.get{date_add(t, 1)}.to_date.must_equal(Date.today+1)
|
125
|
+
@ds.get{date_add(t, Sequel.lit('interval 1 day'))}.to_date.must_equal(Date.today+1)
|
126
|
+
@ds.get{date_add(t, -1)}.to_date.must_equal(Date.today-1)
|
127
|
+
@ds.get{date_add(t, Sequel.lit('interval -1 day'))}.to_date.must_equal(Date.today-1)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should work with Sequel date_arithmetic extension" do
|
131
|
+
@ds.extension!(:date_arithmetic)
|
132
|
+
@ds.get(Sequel.date_add(:t, :days=>1)).to_date.must_equal(Date.today+1)
|
133
|
+
@ds.get(Sequel.date_sub(:t, :days=>1)).to_date.must_equal(Date.today-1)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "Impala syntax" do
|
138
|
+
def ct_sql(opts)
|
139
|
+
DB.send(:create_table_sql, :t, Sequel::Schema::CreateTableGenerator.new(DB){}, opts)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should produce correct sql for create_table" do
|
143
|
+
ct_sql(:external=>true).must_equal 'CREATE EXTERNAL TABLE `t` ()'
|
144
|
+
ct_sql(:stored_as=>:parquet).must_equal 'CREATE TABLE `t` () STORED AS parquet'
|
145
|
+
ct_sql(:location=>'/a/b').must_equal "CREATE TABLE `t` () LOCATION '/a/b'"
|
146
|
+
ct_sql(:field_term=>"\02").must_equal "CREATE TABLE `t` () ROW FORMAT DELIMITED FIELDS TERMINATED BY '\02'"
|
147
|
+
ct_sql(:field_term=>"\02", :field_escape=>"\a").must_equal "CREATE TABLE `t` () ROW FORMAT DELIMITED FIELDS TERMINATED BY '\02' ESCAPED BY '\a'"
|
148
|
+
ct_sql(:line_term=>"\01").must_equal "CREATE TABLE `t` () ROW FORMAT DELIMITED LINES TERMINATED BY '\01'"
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should produce correct sql for load_data" do
|
152
|
+
DB.send(:load_data_sql, '/a/b', :c, {}).must_equal "LOAD DATA INPATH '/a/b' INTO TABLE `c`"
|
153
|
+
DB.send(:load_data_sql, '/a/b', :c, :overwrite=>true).must_equal "LOAD DATA INPATH '/a/b' OVERWRITE INTO TABLE `c`"
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "Impala create_table" do
|
158
|
+
before do
|
159
|
+
@db = DB
|
160
|
+
end
|
161
|
+
after do
|
162
|
+
@db.drop_table?(:items)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should handle row format options" do
|
166
|
+
DB.create_table(:items, :field_term=>"\001", :field_escape=>"\002", :line_term=>"\003"){Integer :a; Integer :b}
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "Impala parquet support" do
|
171
|
+
before do
|
172
|
+
@db = DB
|
173
|
+
end
|
174
|
+
after do
|
175
|
+
@db.drop_table?(:items)
|
176
|
+
@db.drop_table?(:items2)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should support parquet format using create_table :stored_as option" do
|
180
|
+
@db.create_table!(:items, :stored_as=>:parquet){Integer :number}
|
181
|
+
@ds = @db[:items]
|
182
|
+
@ds.insert(1)
|
183
|
+
@ds.all.must_equal [{:number=>1}]
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should support parquet format via Dataset#to_parquet" do
|
187
|
+
@db.create_table!(:items){Integer :number}
|
188
|
+
@ds = @db[:items]
|
189
|
+
@ds.insert(1)
|
190
|
+
@ds.to_parquet(:items2)
|
191
|
+
@db[:items2].all.must_equal [{:number=>1}]
|
192
|
+
end
|
193
|
+
end unless DB.adapter_scheme == :rbhive
|
194
|
+
|
195
|
+
describe "Impala create/drop schemas" do
|
196
|
+
before do
|
197
|
+
DB.drop_table?(:s1__items)
|
198
|
+
DB.drop_schema(:s1, :if_exists=>true)
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should use correct SQL" do
|
202
|
+
DB.send(:create_schema_sql, :s1, {}).must_equal "CREATE SCHEMA `s1`"
|
203
|
+
DB.send(:create_schema_sql, :s1, :if_not_exists=>true).must_equal "CREATE SCHEMA IF NOT EXISTS `s1`"
|
204
|
+
DB.send(:create_schema_sql, :s1, :location=>'/a/b').must_equal "CREATE SCHEMA `s1` LOCATION '/a/b'"
|
205
|
+
|
206
|
+
DB.send(:drop_schema_sql, :s1, {}).must_equal "DROP SCHEMA `s1`"
|
207
|
+
DB.send(:drop_schema_sql, :s1, :if_exists=>true).must_equal "DROP SCHEMA IF EXISTS `s1`"
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should support create_schema and drop_schema" do
|
211
|
+
DB.create_schema(:s1)
|
212
|
+
DB.create_schema(:s1, :if_not_exists=>true)
|
213
|
+
proc{DB.create_schema(:s1)}.must_raise Sequel::DatabaseError
|
214
|
+
DB.create_table(:s1__items){Integer :number}
|
215
|
+
DB[:s1__items].insert(1)
|
216
|
+
DB[:s1__items].all.must_equal [{:number=>1}]
|
217
|
+
DB.drop_table(:s1__items)
|
218
|
+
DB.drop_schema(:s1)
|
219
|
+
proc{DB.drop_schema(:s1)}.must_raise Sequel::DatabaseError
|
220
|
+
DB.drop_schema(:s1, :if_exists=>true)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "Impala :search_path option" do
|
225
|
+
before do
|
226
|
+
DB.create_schema(:s1, :if_not_exists=>true)
|
227
|
+
DB.create_schema(:s2, :if_not_exists=>true)
|
228
|
+
DB.create_schema(:s3, :if_not_exists=>true)
|
229
|
+
DB.create_table(:s1__t1){Integer :a}
|
230
|
+
DB.create_table(:s2__t1){Integer :a}
|
231
|
+
DB.create_table(:s3__t1){Integer :a}
|
232
|
+
DB.create_table(:s2__t2){Integer :a}
|
233
|
+
DB.create_table(:s3__t2){Integer :a}
|
234
|
+
DB.create_table(:s3__t3){Integer :a}
|
235
|
+
DB.opts[:search_path] = 's1,s2,s3'
|
236
|
+
end
|
237
|
+
after do
|
238
|
+
DB.opts.delete(:search_path)
|
239
|
+
DB.drop_table?(:s3__t3, :s3__t2, :s2__t2, :s3__t1, :s2__t1, :s1__t1)
|
240
|
+
DB.drop_schema(:s3)
|
241
|
+
DB.drop_schema(:s2)
|
242
|
+
DB.drop_schema(:s1)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should use the search_path to implicitly qualify tables" do
|
246
|
+
DB[:t1].insert(1)
|
247
|
+
DB[:t2].insert(1)
|
248
|
+
DB[:t3].insert(1)
|
249
|
+
DB[:s1__t1].count.must_equal 1
|
250
|
+
DB[:s2__t2].count.must_equal 1
|
251
|
+
DB[:s3__t3].count.must_equal 1
|
252
|
+
DB[:t1].select_map(:a).must_equal [1]
|
253
|
+
DB[:t1].join(:t2, [:a]).select_map([:t1__a, :t2__a]).must_equal [[1, 1]]
|
254
|
+
DB[:t1].join(:t2, [:a]).join(:t3, [:a]).select_map([:t1__a, :t2__a, :t3__a]).must_equal [[1, 1, 1]]
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
describe "Impala except/intersect" do
|
259
|
+
before do
|
260
|
+
DB.create_table!(:a){Integer :a; Integer :b; Integer :c}
|
261
|
+
DB.create_table!(:b){Integer :d; Integer :e; Integer :f}
|
262
|
+
end
|
263
|
+
after do
|
264
|
+
DB.drop_table?(:a)
|
265
|
+
DB.drop_table?(:b)
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should be emulated correctly" do
|
269
|
+
DB[:a].import([:a, :b, :c], [[1,2,3], [1,2,3], [2,3,4], [3,4,5], [3,4,5]])
|
270
|
+
DB[:b].import([:d, :e, :f], [[1,2,3], [2,3,4], [2,3,4], [4,5,6], [4,5,6]])
|
271
|
+
|
272
|
+
DB[:a].intersect(DB[:b]).select_order_map([:a, :b, :c]).must_equal [[1,2,3], [2,3,4]]
|
273
|
+
DB[:b].intersect(DB[:a]).select_order_map([:d, :e, :f]).must_equal [[1,2,3], [2,3,4]]
|
274
|
+
DB[:a].intersect(DB[:a]).select_order_map([:a, :b, :c]).must_equal [[1,2,3], [2,3,4], [3,4,5]]
|
275
|
+
DB[:b].intersect(DB[:b]).select_order_map([:d, :e, :f]).must_equal [[1,2,3], [2,3,4], [4,5,6]]
|
276
|
+
|
277
|
+
DB[:a].except(DB[:b]).select_order_map([:a, :b, :c]).must_equal [[3,4,5]]
|
278
|
+
DB[:b].except(DB[:a]).select_order_map([:d, :e, :f]).must_equal [[4,5,6]]
|
279
|
+
DB[:a].except(DB[:a]).select_order_map([:a, :b, :c]).must_equal []
|
280
|
+
DB[:b].except(DB[:b]).select_order_map([:d, :e, :f]).must_equal []
|
281
|
+
|
282
|
+
DB[:a].intersect(DB[:b]).unfiltered.select_order_map([:a, :b, :c]).must_equal [[1,2,3], [2,3,4]]
|
283
|
+
DB[:a].except(DB[:b]).unfiltered.select_order_map([:a, :b, :c]).must_equal [[3,4,5]]
|
284
|
+
|
285
|
+
DB[:a].intersect(DB[:b], :alias=>:q).where(:q__b=>2).select_order_map([:a, :b, :c]).must_equal [[1,2,3]]
|
286
|
+
DB[:a].except(DB[:b], :alias=>:q).where(:q__b=>2).select_order_map([:a, :b, :c]).must_equal []
|
287
|
+
DB[:a].except(DB[:b], :alias=>:q).where(:q__b=>4).select_order_map([:a, :b, :c]).must_equal [[3,4,5]]
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|