sequel_impala 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +50 -0
  3. data/LICENSE +463 -0
  4. data/README.md +45 -0
  5. data/Rakefile +39 -0
  6. data/lib/driver/commons-collections-3.2.1.jar +0 -0
  7. data/lib/driver/commons-configuration-1.10.jar +0 -0
  8. data/lib/driver/commons-logging-1.2.jar +0 -0
  9. data/lib/driver/hadoop-auth-2.9.0.jar +0 -0
  10. data/lib/driver/hadoop-common-2.9.0.jar +0 -0
  11. data/lib/driver/hadoop-core-2.6.0.jar +0 -0
  12. data/lib/driver/hive-exec-1.1.0.jar +0 -0
  13. data/lib/driver/hive-jdbc-1.1.0.jar +0 -0
  14. data/lib/driver/hive-metastore-1.1.0.jar +0 -0
  15. data/lib/driver/hive-service-1.1.0.jar +0 -0
  16. data/lib/driver/httpclient-4.3.jar +0 -0
  17. data/lib/driver/httpcore-4.3.jar +0 -0
  18. data/lib/driver/libfb303-0.9.0.jar +0 -0
  19. data/lib/driver/log4j-1.2.17.jar +0 -0
  20. data/lib/driver/slf4j-api-1.7.5.jar +0 -0
  21. data/lib/driver/stax2-api-3.1.4.jar +0 -0
  22. data/lib/driver/woodstox-core-asl-4.4.1.jar +0 -0
  23. data/lib/impala.rb +55 -0
  24. data/lib/impala/connection.rb +180 -0
  25. data/lib/impala/cursor.rb +200 -0
  26. data/lib/impala/progress_reporter.rb +40 -0
  27. data/lib/impala/protocol.rb +8 -0
  28. data/lib/impala/protocol/beeswax_constants.rb +15 -0
  29. data/lib/impala/protocol/beeswax_service.rb +747 -0
  30. data/lib/impala/protocol/beeswax_types.rb +193 -0
  31. data/lib/impala/protocol/exec_stats_constants.rb +13 -0
  32. data/lib/impala/protocol/exec_stats_types.rb +133 -0
  33. data/lib/impala/protocol/facebook_service.rb +706 -0
  34. data/lib/impala/protocol/fb303_constants.rb +15 -0
  35. data/lib/impala/protocol/fb303_types.rb +25 -0
  36. data/lib/impala/protocol/hive_metastore_constants.rb +53 -0
  37. data/lib/impala/protocol/hive_metastore_types.rb +698 -0
  38. data/lib/impala/protocol/impala_hive_server2_service.rb +137 -0
  39. data/lib/impala/protocol/impala_service.rb +443 -0
  40. data/lib/impala/protocol/impala_service_constants.rb +13 -0
  41. data/lib/impala/protocol/impala_service_types.rb +192 -0
  42. data/lib/impala/protocol/status_constants.rb +13 -0
  43. data/lib/impala/protocol/status_types.rb +46 -0
  44. data/lib/impala/protocol/t_c_l_i_service.rb +1108 -0
  45. data/lib/impala/protocol/t_c_l_i_service_constants.rb +72 -0
  46. data/lib/impala/protocol/t_c_l_i_service_types.rb +1802 -0
  47. data/lib/impala/protocol/thrift_hive_metastore.rb +4707 -0
  48. data/lib/impala/protocol/types_constants.rb +13 -0
  49. data/lib/impala/protocol/types_types.rb +332 -0
  50. data/lib/impala/sasl_transport.rb +117 -0
  51. data/lib/impala/thrift_patch.rb +31 -0
  52. data/lib/impala/version.rb +3 -0
  53. data/lib/jdbc/hive2.rb +52 -0
  54. data/lib/jdbc/impala.rb +50 -0
  55. data/lib/rbhive.rb +8 -0
  56. data/lib/rbhive/connection.rb +150 -0
  57. data/lib/rbhive/explain_result.rb +46 -0
  58. data/lib/rbhive/result_set.rb +37 -0
  59. data/lib/rbhive/schema_definition.rb +86 -0
  60. data/lib/rbhive/t_c_l_i_connection.rb +466 -0
  61. data/lib/rbhive/t_c_l_i_result_set.rb +3 -0
  62. data/lib/rbhive/t_c_l_i_schema_definition.rb +87 -0
  63. data/lib/rbhive/table_schema.rb +122 -0
  64. data/lib/rbhive/version.rb +3 -0
  65. data/lib/sequel/adapters/impala.rb +220 -0
  66. data/lib/sequel/adapters/jdbc/hive2.rb +36 -0
  67. data/lib/sequel/adapters/jdbc/impala.rb +38 -0
  68. data/lib/sequel/adapters/rbhive.rb +177 -0
  69. data/lib/sequel/adapters/shared/impala.rb +808 -0
  70. data/lib/sequel/extensions/csv_to_parquet.rb +166 -0
  71. data/lib/thrift/facebook_service.rb +700 -0
  72. data/lib/thrift/fb303_constants.rb +9 -0
  73. data/lib/thrift/fb303_types.rb +19 -0
  74. data/lib/thrift/hive_metastore_constants.rb +41 -0
  75. data/lib/thrift/hive_metastore_types.rb +630 -0
  76. data/lib/thrift/hive_service_constants.rb +13 -0
  77. data/lib/thrift/hive_service_types.rb +72 -0
  78. data/lib/thrift/queryplan_constants.rb +13 -0
  79. data/lib/thrift/queryplan_types.rb +261 -0
  80. data/lib/thrift/sasl_client_transport.rb +161 -0
  81. data/lib/thrift/serde_constants.rb +92 -0
  82. data/lib/thrift/serde_types.rb +7 -0
  83. data/lib/thrift/t_c_l_i_service.rb +1054 -0
  84. data/lib/thrift/t_c_l_i_service_constants.rb +72 -0
  85. data/lib/thrift/t_c_l_i_service_types.rb +1768 -0
  86. data/lib/thrift/thrift_hive.rb +508 -0
  87. data/lib/thrift/thrift_hive_metastore.rb +3856 -0
  88. data/spec/database_test.rb +56 -0
  89. data/spec/dataset_test.rb +1268 -0
  90. data/spec/files/bad_down_migration/001_create_alt_basic.rb +4 -0
  91. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +4 -0
  92. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  93. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  94. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +3 -0
  95. data/spec/files/bad_up_migration/001_create_alt_basic.rb +4 -0
  96. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +3 -0
  97. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +9 -0
  98. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +9 -0
  99. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +4 -0
  100. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +9 -0
  101. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +9 -0
  102. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  103. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +9 -0
  104. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +4 -0
  105. data/spec/files/integer_migrations/001_create_sessions.rb +9 -0
  106. data/spec/files/integer_migrations/002_create_nodes.rb +9 -0
  107. data/spec/files/integer_migrations/003_3_create_users.rb +4 -0
  108. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +9 -0
  109. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +9 -0
  110. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +9 -0
  111. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +9 -0
  112. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +4 -0
  113. data/spec/files/reversible_migrations/001_reversible.rb +5 -0
  114. data/spec/files/reversible_migrations/002_reversible.rb +5 -0
  115. data/spec/files/reversible_migrations/003_reversible.rb +5 -0
  116. data/spec/files/reversible_migrations/004_reversible.rb +5 -0
  117. data/spec/files/reversible_migrations/005_reversible.rb +10 -0
  118. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +9 -0
  119. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +9 -0
  120. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +4 -0
  121. data/spec/impala_test.rb +290 -0
  122. data/spec/migrator_test.rb +240 -0
  123. data/spec/plugin_test.rb +91 -0
  124. data/spec/prepared_statement_test.rb +327 -0
  125. data/spec/schema_test.rb +356 -0
  126. data/spec/spec_helper.rb +19 -0
  127. data/spec/timezone_test.rb +86 -0
  128. data/spec/type_test.rb +99 -0
  129. metadata +294 -0
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{get(:asdfsadfsa)}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm22222){Integer :smc2}}
3
+ down{drop_table(:sm22222)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ get(:asdfsadfas)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ up{get(:asdfsadfas)}
3
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm11111){Integer :smc1}}
3
+ down{drop_table(:sm11111)}
4
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ up{get(:asdfassfd)}
3
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateArtists < Sequel::Migration
2
+ def up
3
+ create_table(:sm1122){Integer :smc12}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1122)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAlbums < Sequel::Migration
2
+ def up
3
+ create_table(:sm2233){Integer :smc23}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2233)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateArtists < Sequel::Migration
2
+ def up
3
+ create_table(:sm1122){Integer :smc12}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1122)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAlbums < Sequel::Migration
2
+ def up
3
+ create_table(:sm2233){Integer :smc23}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2233)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:a){Integer :a}
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ add_column :a, :b, String
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ rename_column :a, :b, :c
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ rename_table :a, :b
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:b) do
4
+ add_column :d, String
5
+ end
6
+ alter_table(:b) do
7
+ rename_column :d, :e
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class CreateSessions < Sequel::Migration
2
+ def up
3
+ create_table(:sm1111){Integer :smc1}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm1111)
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ Class.new(Sequel::Migration) do
2
+ def up
3
+ create_table(:sm2222){Integer :smc2}
4
+ end
5
+
6
+ def down
7
+ drop_table(:sm2222)
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ up{create_table(:sm3333){Integer :smc3}}
3
+ down{drop_table(:sm3333)}
4
+ end
@@ -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
+