purview 1.0.0.alpha → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -4
  3. data/Gemfile +10 -0
  4. data/README.md +2 -2
  5. data/TODO +10 -5
  6. data/lib/purview/columns/base.rb +2 -2
  7. data/lib/purview/columns.rb +1 -0
  8. data/lib/purview/connections/base.rb +17 -31
  9. data/lib/purview/connections/mysql.rb +2 -30
  10. data/lib/purview/connections/postgresql.rb +2 -18
  11. data/lib/purview/databases/base.rb +32 -31
  12. data/lib/purview/databases/mysql.rb +4 -16
  13. data/lib/purview/databases/postgresql.rb +4 -16
  14. data/lib/purview/databases.rb +1 -0
  15. data/lib/purview/dialects/base.rb +25 -0
  16. data/lib/purview/dialects/mysql.rb +25 -0
  17. data/lib/purview/dialects/postgresql.rb +25 -0
  18. data/lib/purview/dialects.rb +4 -0
  19. data/lib/purview/exceptions/{table.rb → base_table.rb} +1 -1
  20. data/lib/purview/exceptions/could_not_acquire_lock.rb +1 -1
  21. data/lib/purview/exceptions/lock_already_released.rb +1 -1
  22. data/lib/purview/exceptions/no_window.rb +1 -1
  23. data/lib/purview/exceptions.rb +2 -1
  24. data/lib/purview/loaders/base.rb +26 -2
  25. data/lib/purview/loaders/mysql.rb +4 -0
  26. data/lib/purview/loaders/postgresql.rb +4 -0
  27. data/lib/purview/loaders.rb +1 -0
  28. data/lib/purview/loggers.rb +1 -0
  29. data/lib/purview/mixins/connection.rb +13 -0
  30. data/lib/purview/mixins/helpers.rb +5 -1
  31. data/lib/purview/mixins/logger.rb +2 -2
  32. data/lib/purview/mixins.rb +1 -0
  33. data/lib/purview/parsers/base.rb +7 -11
  34. data/lib/purview/parsers/csv.rb +19 -3
  35. data/lib/purview/parsers/sql.rb +13 -0
  36. data/lib/purview/parsers.rb +2 -0
  37. data/lib/purview/pullers/base.rb +4 -0
  38. data/lib/purview/pullers/base_sql.rb +97 -0
  39. data/lib/purview/pullers/mysql.rb +15 -0
  40. data/lib/purview/pullers/postgresql.rb +15 -0
  41. data/lib/purview/pullers.rb +4 -0
  42. data/lib/purview/raw_connections/base.rb +118 -0
  43. data/lib/purview/raw_connections/jdbc/base.rb +65 -0
  44. data/lib/purview/raw_connections/jdbc/mysql.rb +19 -0
  45. data/lib/purview/raw_connections/jdbc/postgres.rb +19 -0
  46. data/lib/purview/raw_connections/jdbc.rb +4 -0
  47. data/lib/purview/raw_connections/mysql2.rb +35 -0
  48. data/lib/purview/raw_connections/pg.rb +35 -0
  49. data/lib/purview/raw_connections.rb +8 -0
  50. data/lib/purview/refinements/object.rb +4 -0
  51. data/lib/purview/refinements/string.rb +5 -0
  52. data/lib/purview/refinements.rb +1 -0
  53. data/lib/purview/structs/base.rb +12 -2
  54. data/lib/purview/structs/row.rb +7 -0
  55. data/lib/purview/structs.rb +2 -0
  56. data/lib/purview/tables/base.rb +1 -1
  57. data/lib/purview/types.rb +1 -0
  58. data/lib/purview/version.rb +1 -1
  59. data/lib/purview.rb +3 -3
  60. data/purview.gemspec +2 -2
  61. metadata +25 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4753e561eece41d8838e916c7914ae3b3d155b3b
4
- data.tar.gz: 8430637788951088580baa1f533540968974f28c
3
+ metadata.gz: 48f684f51dd0c4ff6b947959f5c1a3c2eb9489d9
4
+ data.tar.gz: 832f24cb3904d7fb527b5cabc36d75f488b494ac
5
5
  SHA512:
6
- metadata.gz: 742e3ab26e898924c9054b461d41c700144859910b96ccfd2df6ac6e9d51bb2945a61f73282445f7c239c8adfeb4cc53bdf518aad195b91cc931cdeca24639bb
7
- data.tar.gz: 43d8b1a2b5f6cf401a33e254a8b63169b1764fe3a88b83391a91b6068203b0bd02df339746982580864aba2a3c3f9ae0ba079fd938f31fe687d37e38b7aff987
6
+ metadata.gz: f5d78891cc67a18657720290c7bf5cfb8c41259b7a574eb23b0e6160c987a43cfbe513948ca0d35b3df8c4372fce790c9cb64986a83596ba1ecfad825998eb17
7
+ data.tar.gz: 9e4004abc1d287912deaabb8634589db52ea15fbaf6c561609e7f058a8966cbc6fdc778e48abd3780b00a17451683b8f13a471b9818cfbddf54a263d6f3b4d9d
data/.travis.yml CHANGED
@@ -1,9 +1,5 @@
1
1
  language: ruby
2
2
 
3
- matrix:
4
- allow_failures:
5
- - rvm: jruby-19mode
6
-
7
3
  rvm:
8
4
  - 1.9.3
9
5
  - 2.0.0
data/Gemfile CHANGED
@@ -1,3 +1,13 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ group :development do
4
+ if defined?(JRUBY_VERSION)
5
+ gem 'jdbc-mysql', '~> 5.1'
6
+ gem 'jdbc-postgres', '~> 9.4'
7
+ else
8
+ gem 'mysql2', '~> 0.3'
9
+ gem 'pg', '~> 0.18'
10
+ end
11
+ end
12
+
3
13
  gemspec
data/README.md CHANGED
@@ -61,7 +61,7 @@ columns = [
61
61
  ]
62
62
  ```
63
63
 
64
- Configure the `Puller` (available puller-types: `URI`)
64
+ Configure the `Puller` (available puller-types: `MySQL`, `PostgreSQL` & `URI`)
65
65
  ```ruby
66
66
  puller_opts = {
67
67
  :type => Purview::Pullers::URI,
@@ -69,7 +69,7 @@ puller_opts = {
69
69
  }
70
70
  ```
71
71
 
72
- Configure the `Parser` (available parser-types: `CSV` & `TSV`)
72
+ Configure the `Parser` (available parser-types: `CSV`, `SQL` & `TSV`)
73
73
  ```ruby
74
74
  parser_opts = {
75
75
  :type => Purview::Parsers::TSV,
data/TODO CHANGED
@@ -40,6 +40,10 @@
40
40
  * Finish PostgreSQL support (requires `pg` gem)
41
41
  * Finish MySQL support (requires `mysql2` gem)
42
42
  * Usage/configuration examples in README.md
43
+ * Create SQL-puller(s)
44
+ * Introduce [SQL] dialect(s)
45
+ * Fix JRuby bundle/build
46
+ * Fall back to logged in user if no [database-]username is provided
43
47
 
44
48
  ... ONGOING TASKS ...
45
49
 
@@ -49,16 +53,17 @@
49
53
 
50
54
  ... OPEN TASKS ....
51
55
 
52
- * Create table class to encapulate `table_metadata` logic
56
+ * Add COPY `def copy(sql)` support to PostgreSQL connection
57
+ * Leverage COPY support for PostgreSQL pulls
58
+ * Create class to encapulate `table_metadata` logic
59
+ * Further encapsulate `Dialect` logic
53
60
  * Build out change-log tables
54
61
  * Build out canonical, fact and aggregate tables (and related transforms)
55
62
  * Configurable re-pull window (do this automatically once up to current?)
56
63
  * Add schema management capabilities (detect schema-deltas and suggestion
57
64
  modifications)
58
-
59
- ... DEFERRED TASKS ...
60
-
61
- * Fix JRuby bundle/build
65
+ * Refactor mutator methods to be globally available (e.g. coalesced -> Coalesce,
66
+ quoted -> Quote, etc.)
62
67
 
63
68
  ... CLOSED QUESTIONS ...
64
69
 
@@ -25,7 +25,7 @@ module Purview
25
25
  end
26
26
 
27
27
  def nullable
28
- coalesce(opts[:nullable], true)
28
+ coalesced(opts[:nullable], true)
29
29
  end
30
30
 
31
31
  def nullable?
@@ -48,7 +48,7 @@ module Purview
48
48
  end
49
49
 
50
50
  def type
51
- coalesce(opts[:type], Purview::Types::String)
51
+ coalesced(opts[:type], Purview::Types::String)
52
52
  end
53
53
 
54
54
  private
@@ -1,4 +1,5 @@
1
1
  require 'purview/columns/base'
2
+
2
3
  require 'purview/columns/boolean'
3
4
  require 'purview/columns/date'
4
5
  require 'purview/columns/float'
@@ -1,54 +1,40 @@
1
1
  module Purview
2
2
  module Connections
3
3
  class Base
4
- def initialize(opts={})
5
- @opts = opts
4
+ def self.connect(opts)
5
+ new(opts)
6
6
  end
7
7
 
8
- def connect
9
- @connection ||= new_connection
10
- self
8
+ def self.with_new_connection(opts)
9
+ yield connection = connect(opts)
10
+ ensure
11
+ connection.disconnect if connection
12
+ end
13
+
14
+ def initialize(opts)
15
+ @raw_connection = raw_connection_type.connect(opts)
11
16
  end
12
17
 
13
18
  def disconnect
14
- connection.close
15
- @connection = nil
19
+ raw_connection.disconnect
20
+ @raw_connection = nil
16
21
  self
17
22
  end
18
23
 
19
24
  def execute(sql)
20
- logger.debug("Executing: #{sql}")
21
- result = execute_sql(sql)
22
- Purview::Structs::Result.new(
23
- :rows => extract_rows(result),
24
- :rows_affected => extract_rows_affected(result)
25
- )
25
+ raw_connection.execute(sql)
26
26
  end
27
27
 
28
28
  def with_transaction
29
- raise %{All "#{Base}(s)" must override the "with_transaction" method}
29
+ raw_connection.with_transaction { yield }
30
30
  end
31
31
 
32
32
  private
33
33
 
34
- include Purview::Mixins::Logger
35
-
36
- attr_reader :opts, :connection
37
-
38
- def execute_sql(sql)
39
- raise %{All "#{Base}(s)" must override the "execute_sql" method}
40
- end
41
-
42
- def extract_rows(result)
43
- raise %{All "#{Base}(s)" must override the "extract_rows" method}
44
- end
45
-
46
- def extract_rows_affected(result)
47
- raise %{All "#{Base}(s)" must override the "extract_rows_affected" method}
48
- end
34
+ attr_reader :raw_connection
49
35
 
50
- def new_connection
51
- raise %{All "#{Base}(s)" must override the "new_connection" method}
36
+ def raw_connection_type
37
+ raise %{All "#{Base}(s)" must override the "raw_connection_type" method}
52
38
  end
53
39
  end
54
40
  end
@@ -1,38 +1,10 @@
1
1
  module Purview
2
2
  module Connections
3
3
  class MySQL < Base
4
- def with_transaction
5
- connection.query(BEGIN_TRANSACTION)
6
- yield.tap { |result| connection.query(COMMIT_TRANSACTION) }
7
- rescue Mysql2::Error
8
- connection.query(ROLLBACK_TRANSACTION)
9
- raise
10
- end
11
-
12
4
  private
13
5
 
14
- BEGIN_TRANSACTION = 'BEGIN'
15
- COMMIT_TRANSACTION = 'COMMIT'
16
- ROLLBACK_TRANSACTION = 'ROLLBACK'
17
-
18
- def execute_sql(sql)
19
- connection.query(sql, query_opts)
20
- end
21
-
22
- def extract_rows(result)
23
- result && result.to_a
24
- end
25
-
26
- def extract_rows_affected(result)
27
- connection.affected_rows
28
- end
29
-
30
- def new_connection
31
- Mysql2::Client.new(opts)
32
- end
33
-
34
- def query_opts
35
- { :cast => false }
6
+ def raw_connection_type
7
+ Purview::RawConnections::MySQL
36
8
  end
37
9
  end
38
10
  end
@@ -1,26 +1,10 @@
1
1
  module Purview
2
2
  module Connections
3
3
  class PostgreSQL < Base
4
- def with_transaction
5
- connection.transaction { yield }
6
- end
7
-
8
4
  private
9
5
 
10
- def execute_sql(sql)
11
- connection.exec(sql)
12
- end
13
-
14
- def extract_rows(result)
15
- result && result.to_a
16
- end
17
-
18
- def extract_rows_affected(result)
19
- result && result.cmd_tuples
20
- end
21
-
22
- def new_connection
23
- PG.connect(opts)
6
+ def raw_connection_type
7
+ Purview::RawConnections::PostgreSQL
24
8
  end
25
9
  end
26
10
  end
@@ -13,10 +13,6 @@ module Purview
13
13
  @tables << table
14
14
  end
15
15
 
16
- def connect
17
- connection.connect
18
- end
19
-
20
16
  def create_index(connection, table, columns, opts={})
21
17
  table_opts = extract_table_options(opts)
22
18
  table_name = table_name(table, table_opts)
@@ -142,10 +138,6 @@ module Purview
142
138
  end
143
139
  end
144
140
 
145
- def false_value
146
- raise %{All "#{Base}(s)" must override the "false_value" method}
147
- end
148
-
149
141
  def lock_table(table, timestamp)
150
142
  with_context_logging("`lock_table` for: #{table_name(table)}") do
151
143
  with_new_connection do |connection|
@@ -157,14 +149,6 @@ module Purview
157
149
  end
158
150
  end
159
151
 
160
- def null_value
161
- raise %{All "#{Base}(s)" must override the "null_value" method}
162
- end
163
-
164
- def quoted(value)
165
- value.nil? ? null_value : value.quoted
166
- end
167
-
168
152
  def sync
169
153
  with_new_connection do |connection|
170
154
  with_transaction(connection) do |timestamp|
@@ -183,10 +167,6 @@ module Purview
183
167
  end
184
168
  end
185
169
 
186
- def true_value
187
- raise %{All "#{Base}(s)" must override the "true_value" method}
188
- end
189
-
190
170
  def unlock_table(table)
191
171
  with_context_logging("`unlock_table` for: #{table_name(table)}") do
192
172
  with_new_connection do |connection|
@@ -200,11 +180,14 @@ module Purview
200
180
 
201
181
  private
202
182
 
183
+ include Purview::Mixins::Connection
203
184
  include Purview::Mixins::Helpers
204
185
  include Purview::Mixins::Logger
205
186
 
206
187
  attr_reader :opts, :tables
207
188
 
189
+ public :connect
190
+
208
191
  def column_names(columns)
209
192
  columns.map(&:name)
210
193
  end
@@ -235,12 +218,8 @@ module Purview
235
218
  end
236
219
  end
237
220
 
238
- def connection
239
- connection_type.new(connection_opts)
240
- end
241
-
242
221
  def connection_opts
243
- {}
222
+ { :database => name }
244
223
  end
245
224
 
246
225
  def connection_type
@@ -267,6 +246,14 @@ module Purview
267
246
  {}
268
247
  end
269
248
 
249
+ def dialect
250
+ dialect_type.new
251
+ end
252
+
253
+ def dialect_type
254
+ raise %{All "#{Base}(s)" must override the "dialect_type" method}
255
+ end
256
+
270
257
  def drop_index_sql(table_name, index_name, table, columns, index_opts={})
271
258
  raise %{All "#{Base}(s)" must override the "drop_index_sql" method}
272
259
  end
@@ -305,6 +292,10 @@ module Purview
305
292
  opts[:table] || { :create_indices => true }
306
293
  end
307
294
 
295
+ def false_value
296
+ dialect.false_value
297
+ end
298
+
308
299
  def get_enabled_for_table(connection, table)
309
300
  row = connection.execute(get_last_pulled_at_for_table_sql(table)).rows[0]
310
301
  enabled = row[table_metadata_enabled_column_name]
@@ -390,6 +381,10 @@ module Purview
390
381
  Purview::Structs::Window.new(:min => min, :max => max)
391
382
  end
392
383
 
384
+ def null_value
385
+ dialect.null_value
386
+ end
387
+
393
388
  def nullable?(column)
394
389
  column.nullable?
395
390
  end
@@ -398,6 +393,14 @@ module Purview
398
393
  column.primary_key?
399
394
  end
400
395
 
396
+ def quoted(value)
397
+ dialect.quoted(value)
398
+ end
399
+
400
+ def sanitized(value)
401
+ dialect.sanitized(value)
402
+ end
403
+
401
404
  def set_enabled_for_table(connection, table, enabled)
402
405
  connection.execute(set_enabled_for_table_sql(table, enabled))
403
406
  end
@@ -491,6 +494,10 @@ module Purview
491
494
  table_opts[:name] || table.name
492
495
  end
493
496
 
497
+ def true_value
498
+ dialect.true_value
499
+ end
500
+
494
501
  def type(column)
495
502
  type_map[column.type]
496
503
  end
@@ -512,12 +519,6 @@ module Purview
512
519
  raise %{All "#{Base}(s)" must override the "unlock_table_sql" method}
513
520
  end
514
521
 
515
- def with_new_connection
516
- yield connection = connect
517
- ensure
518
- connection.disconnect if connection
519
- end
520
-
521
522
  def with_next_table(connection, timestamp)
522
523
  table = next_table(connection, timestamp)
523
524
  raise Purview::Exceptions::NoTable.new unless table
@@ -1,24 +1,8 @@
1
1
  module Purview
2
2
  module Databases
3
3
  class MySQL < Base
4
- def false_value
5
- '0'
6
- end
7
-
8
- def null_value
9
- 'NULL'
10
- end
11
-
12
- def true_value
13
- '1'
14
- end
15
-
16
4
  private
17
5
 
18
- def connection_opts
19
- super.merge(:database => name)
20
- end
21
-
22
6
  def connection_type
23
7
  Purview::Connections::MySQL
24
8
  end
@@ -49,6 +33,10 @@ module Purview
49
33
  super.merge(Purview::Types::Timestamp => '0')
50
34
  end
51
35
 
36
+ def dialect_type
37
+ Purview::Dialects::MySQL
38
+ end
39
+
52
40
  def drop_index_sql(table_name, index_name, table, columns, index_opts={})
53
41
  'DROP INDEX %s' % [
54
42
  index_name,
@@ -1,24 +1,8 @@
1
1
  module Purview
2
2
  module Databases
3
3
  class PostgreSQL < Base
4
- def false_value
5
- 'FALSE'
6
- end
7
-
8
- def null_value
9
- 'NULL'
10
- end
11
-
12
- def true_value
13
- 'TRUE'
14
- end
15
-
16
4
  private
17
5
 
18
- def connection_opts
19
- super.merge(:dbname => name)
20
- end
21
-
22
6
  def connection_type
23
7
  Purview::Connections::PostgreSQL
24
8
  end
@@ -45,6 +29,10 @@ module Purview
45
29
  ]
46
30
  end
47
31
 
32
+ def dialect_type
33
+ Purview::Dialects::PostgreSQL
34
+ end
35
+
48
36
  def drop_index_sql(table_name, index_name, table, columns, index_opts={})
49
37
  'DROP INDEX %s' % [
50
38
  index_name,
@@ -1,3 +1,4 @@
1
1
  require 'purview/databases/base'
2
+
2
3
  require 'purview/databases/mysql'
3
4
  require 'purview/databases/postgresql'
@@ -0,0 +1,25 @@
1
+ module Purview
2
+ module Dialects
3
+ class Base
4
+ def false_value
5
+ raise %{All "#{Base}(s)" must override the "false_value" method}
6
+ end
7
+
8
+ def null_value
9
+ raise %{All "#{Base}(s)" must override the "null_value" method}
10
+ end
11
+
12
+ def quoted(value)
13
+ raise %{All "#{Base}(s)" must override the "quoted" method}
14
+ end
15
+
16
+ def sanitized(value)
17
+ raise %{All "#{Base}(s)" must override the "sanitized" method}
18
+ end
19
+
20
+ def true_value
21
+ raise %{All "#{Base}(s)" must override the "true_value" method}
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Purview
2
+ module Dialects
3
+ class MySQL < Base
4
+ def false_value
5
+ '0'
6
+ end
7
+
8
+ def null_value
9
+ 'NULL'
10
+ end
11
+
12
+ def quoted(value)
13
+ value.nil? ? null_value : value.quoted
14
+ end
15
+
16
+ def sanitized(value)
17
+ value.nil? ? null_value : value.sanitized
18
+ end
19
+
20
+ def true_value
21
+ '1'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ module Purview
2
+ module Dialects
3
+ class PostgreSQL < Base
4
+ def false_value
5
+ 'FALSE'
6
+ end
7
+
8
+ def null_value
9
+ 'NULL'
10
+ end
11
+
12
+ def quoted(value)
13
+ value.nil? ? null_value : value.quoted
14
+ end
15
+
16
+ def sanitized(value)
17
+ value.nil? ? null_value : value.sanitized
18
+ end
19
+
20
+ def true_value
21
+ 'TRUE'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,4 @@
1
+ require 'purview/dialects/base'
2
+
3
+ require 'purview/dialects/mysql'
4
+ require 'purview/dialects/postgresql'
@@ -1,6 +1,6 @@
1
1
  module Purview
2
2
  module Exceptions
3
- class Table < Base
3
+ class BaseTable < Base
4
4
  def initialize(table)
5
5
  @table = table
6
6
  end
@@ -1,6 +1,6 @@
1
1
  module Purview
2
2
  module Exceptions
3
- class CouldNotAcquireLock < Table
3
+ class CouldNotAcquireLock < BaseTable
4
4
  def message
5
5
  "Could not acquire the lock for table: #{table.name}"
6
6
  end
@@ -1,6 +1,6 @@
1
1
  module Purview
2
2
  module Exceptions
3
- class LockAlreadyReleased < Table
3
+ class LockAlreadyReleased < BaseTable
4
4
  def message
5
5
  "Lock already released for table: #{table.name}"
6
6
  end
@@ -1,6 +1,6 @@
1
1
  module Purview
2
2
  module Exceptions
3
- class NoWindow < Table
3
+ class NoWindow < BaseTable
4
4
  def message
5
5
  "Could not find a window for table: #{table.name}"
6
6
  end
@@ -1,5 +1,6 @@
1
1
  require 'purview/exceptions/base'
2
- require 'purview/exceptions/table'
2
+ require 'purview/exceptions/base_table'
3
+
3
4
  require 'purview/exceptions/could_not_acquire_lock'
4
5
  require 'purview/exceptions/lock_already_released'
5
6
  require 'purview/exceptions/no_table'
@@ -49,6 +49,18 @@ module Purview
49
49
  table.database
50
50
  end
51
51
 
52
+ def dialect
53
+ dialect_type.new
54
+ end
55
+
56
+ def dialect_type
57
+ raise %{All "#{Base}(s)" must override the "dialect_type" method}
58
+ end
59
+
60
+ def false_value
61
+ dialect.false_value
62
+ end
63
+
52
64
  def id_in_sql(temporary_table_name)
53
65
  raise %{All "#{Base}(s)" must override the "id_in_sql" method}
54
66
  end
@@ -74,18 +86,26 @@ module Purview
74
86
  raise %{All "#{Base}(s)" must override the "not_in_window_sql" method}
75
87
  end
76
88
 
89
+ def null_value
90
+ dialect.null_value
91
+ end
92
+
77
93
  def quoted(value)
78
- database.quoted(value)
94
+ dialect.quoted(value)
79
95
  end
80
96
 
81
97
  def row_values(row)
82
- table.column_names.map { |column_name| quoted(row[column_name]) }.join(', ')
98
+ table.column_names.map { |column_name| quoted(sanitized(row[column_name])) }.join(', ')
83
99
  end
84
100
 
85
101
  def rows_per_slice
86
102
  opts[:rows_per_slice] || 1000
87
103
  end
88
104
 
105
+ def sanitized(value)
106
+ dialect.sanitized(value)
107
+ end
108
+
89
109
  def table
90
110
  opts[:table]
91
111
  end
@@ -117,6 +137,10 @@ module Purview
117
137
  raise %{All "#{Base}(s)" must override the "temporary_table_verify_sql" method}
118
138
  end
119
139
 
140
+ def true_value
141
+ dialect.true_value
142
+ end
143
+
120
144
  def verify_temporary_table(connection, temporary_table_name, rows, window)
121
145
  with_context_logging("`verify_temporary_table` for: #{temporary_table_name}") do
122
146
  rows_outside_window = connection.execute(
@@ -3,6 +3,10 @@ module Purview
3
3
  class MySQL < Base
4
4
  private
5
5
 
6
+ def dialect_type
7
+ Purview::Dialects::MySQL
8
+ end
9
+
6
10
  def id_in_sql(temporary_table_name)
7
11
  'SELECT %s FROM %s' % [
8
12
  table.id_column.name,