sequel_impala 1.1.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 (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
+