sequel 3.21.0 → 3.36.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.
- data/CHANGELOG +855 -3
- data/MIT-LICENSE +1 -1
- data/README.rdoc +23 -7
- data/Rakefile +42 -24
- data/bin/sequel +26 -8
- data/doc/active_record.rdoc +1 -0
- data/doc/advanced_associations.rdoc +171 -11
- data/doc/association_basics.rdoc +293 -43
- data/doc/dataset_basics.rdoc +5 -5
- data/doc/dataset_filtering.rdoc +8 -0
- data/doc/mass_assignment.rdoc +56 -0
- data/doc/migration.rdoc +85 -552
- data/doc/model_hooks.rdoc +78 -27
- data/doc/object_model.rdoc +541 -0
- data/doc/opening_databases.rdoc +97 -50
- data/doc/prepared_statements.rdoc +40 -14
- data/doc/querying.rdoc +28 -4
- data/doc/reflection.rdoc +30 -4
- data/doc/release_notes/3.22.0.txt +39 -0
- data/doc/release_notes/3.23.0.txt +172 -0
- data/doc/release_notes/3.24.0.txt +420 -0
- data/doc/release_notes/3.25.0.txt +88 -0
- data/doc/release_notes/3.26.0.txt +88 -0
- data/doc/release_notes/3.27.0.txt +82 -0
- data/doc/release_notes/3.28.0.txt +304 -0
- data/doc/release_notes/3.29.0.txt +459 -0
- data/doc/release_notes/3.30.0.txt +135 -0
- data/doc/release_notes/3.31.0.txt +146 -0
- data/doc/release_notes/3.32.0.txt +202 -0
- data/doc/release_notes/3.33.0.txt +157 -0
- data/doc/release_notes/3.34.0.txt +671 -0
- data/doc/release_notes/3.35.0.txt +144 -0
- data/doc/release_notes/3.36.0.txt +245 -0
- data/doc/schema_modification.rdoc +572 -0
- data/doc/sharding.rdoc +95 -3
- data/doc/testing.rdoc +129 -0
- data/doc/thread_safety.rdoc +17 -0
- data/doc/transactions.rdoc +137 -0
- data/doc/virtual_rows.rdoc +51 -2
- data/lib/sequel/adapters/ado/mssql.rb +18 -6
- data/lib/sequel/adapters/ado.rb +40 -18
- data/lib/sequel/adapters/amalgalite.rb +17 -9
- data/lib/sequel/adapters/db2.rb +175 -86
- data/lib/sequel/adapters/dbi.rb +15 -15
- data/lib/sequel/adapters/do/mysql.rb +17 -11
- data/lib/sequel/adapters/do/postgres.rb +1 -57
- data/lib/sequel/adapters/do/sqlite.rb +0 -10
- data/lib/sequel/adapters/do.rb +18 -36
- data/lib/sequel/adapters/firebird.rb +27 -208
- data/lib/sequel/adapters/ibmdb.rb +453 -0
- data/lib/sequel/adapters/informix.rb +6 -23
- data/lib/sequel/adapters/jdbc/as400.rb +16 -34
- data/lib/sequel/adapters/jdbc/db2.rb +47 -0
- data/lib/sequel/adapters/jdbc/derby.rb +287 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
- data/lib/sequel/adapters/jdbc/h2.rb +73 -31
- data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
- data/lib/sequel/adapters/jdbc/informix.rb +21 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
- data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
- data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
- data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
- data/lib/sequel/adapters/jdbc/progress.rb +21 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
- data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
- data/lib/sequel/adapters/jdbc.rb +265 -94
- data/lib/sequel/adapters/mock.rb +361 -0
- data/lib/sequel/adapters/mysql.rb +118 -222
- data/lib/sequel/adapters/mysql2.rb +58 -57
- data/lib/sequel/adapters/odbc/mssql.rb +15 -7
- data/lib/sequel/adapters/odbc.rb +28 -9
- data/lib/sequel/adapters/openbase.rb +3 -5
- data/lib/sequel/adapters/oracle.rb +349 -53
- data/lib/sequel/adapters/postgres.rb +356 -107
- data/lib/sequel/adapters/shared/access.rb +32 -9
- data/lib/sequel/adapters/shared/db2.rb +342 -0
- data/lib/sequel/adapters/shared/firebird.rb +221 -0
- data/lib/sequel/adapters/shared/informix.rb +53 -0
- data/lib/sequel/adapters/shared/mssql.rb +335 -118
- data/lib/sequel/adapters/shared/mysql.rb +340 -76
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
- data/lib/sequel/adapters/shared/oracle.rb +243 -45
- data/lib/sequel/adapters/shared/postgres.rb +524 -279
- data/lib/sequel/adapters/shared/progress.rb +5 -8
- data/lib/sequel/adapters/shared/sqlite.rb +265 -89
- data/lib/sequel/adapters/sqlite.rb +101 -39
- data/lib/sequel/adapters/swift/mysql.rb +9 -12
- data/lib/sequel/adapters/swift/postgres.rb +9 -74
- data/lib/sequel/adapters/swift/sqlite.rb +8 -6
- data/lib/sequel/adapters/swift.rb +8 -7
- data/lib/sequel/adapters/tinytds.rb +161 -21
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
- data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
- data/lib/sequel/ast_transformer.rb +194 -0
- data/lib/sequel/connection_pool/sharded_single.rb +11 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
- data/lib/sequel/connection_pool/single.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +38 -14
- data/lib/sequel/connection_pool.rb +10 -2
- data/lib/sequel/core.rb +118 -11
- data/lib/sequel/database/connecting.rb +38 -28
- data/lib/sequel/database/dataset.rb +4 -4
- data/lib/sequel/database/dataset_defaults.rb +63 -2
- data/lib/sequel/database/logging.rb +7 -2
- data/lib/sequel/database/misc.rb +150 -46
- data/lib/sequel/database/query.rb +215 -65
- data/lib/sequel/database/schema_generator.rb +64 -20
- data/lib/sequel/database/schema_methods.rb +212 -54
- data/lib/sequel/dataset/actions.rb +322 -85
- data/lib/sequel/dataset/features.rb +96 -8
- data/lib/sequel/dataset/graph.rb +38 -11
- data/lib/sequel/dataset/misc.rb +50 -23
- data/lib/sequel/dataset/mutation.rb +12 -7
- data/lib/sequel/dataset/prepared_statements.rb +68 -30
- data/lib/sequel/dataset/query.rb +237 -44
- data/lib/sequel/dataset/sql.rb +698 -278
- data/lib/sequel/dataset.rb +8 -0
- data/lib/sequel/exceptions.rb +4 -0
- data/lib/sequel/extensions/_pretty_table.rb +79 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
- data/lib/sequel/extensions/columns_introspection.rb +61 -0
- data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
- data/lib/sequel/extensions/migration.rb +97 -11
- data/lib/sequel/extensions/named_timezones.rb +5 -0
- data/lib/sequel/extensions/null_dataset.rb +90 -0
- data/lib/sequel/extensions/pg_array.rb +460 -0
- data/lib/sequel/extensions/pg_array_ops.rb +220 -0
- data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
- data/lib/sequel/extensions/pg_hstore.rb +296 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
- data/lib/sequel/extensions/pg_inet.rb +89 -0
- data/lib/sequel/extensions/pg_json.rb +178 -0
- data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
- data/lib/sequel/extensions/pretty_table.rb +5 -71
- data/lib/sequel/extensions/query.rb +1 -1
- data/lib/sequel/extensions/query_literals.rb +79 -0
- data/lib/sequel/extensions/schema_caching.rb +76 -0
- data/lib/sequel/extensions/schema_dumper.rb +251 -37
- data/lib/sequel/extensions/select_remove.rb +35 -0
- data/lib/sequel/extensions/server_block.rb +139 -0
- data/lib/sequel/extensions/sql_expr.rb +4 -110
- data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
- data/lib/sequel/extensions/to_dot.rb +95 -83
- data/lib/sequel/model/associations.rb +1187 -393
- data/lib/sequel/model/base.rb +578 -170
- data/lib/sequel/model/errors.rb +1 -1
- data/lib/sequel/model/exceptions.rb +5 -1
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model.rb +30 -11
- data/lib/sequel/no_core_ext.rb +2 -0
- data/lib/sequel/plugins/active_model.rb +13 -1
- data/lib/sequel/plugins/association_pks.rb +22 -4
- data/lib/sequel/plugins/caching.rb +25 -18
- data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
- data/lib/sequel/plugins/composition.rb +44 -12
- data/lib/sequel/plugins/dataset_associations.rb +100 -0
- data/lib/sequel/plugins/defaults_setter.rb +58 -0
- data/lib/sequel/plugins/dirty.rb +214 -0
- data/lib/sequel/plugins/eager_each.rb +59 -0
- data/lib/sequel/plugins/force_encoding.rb +6 -6
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/identity_map.rb +123 -8
- data/lib/sequel/plugins/instance_filters.rb +10 -0
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +58 -6
- data/lib/sequel/plugins/list.rb +12 -2
- data/lib/sequel/plugins/many_through_many.rb +79 -28
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
- data/lib/sequel/plugins/nested_attributes.rb +139 -63
- data/lib/sequel/plugins/optimistic_locking.rb +8 -0
- data/lib/sequel/plugins/prepared_statements.rb +167 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
- data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
- data/lib/sequel/plugins/rcte_tree.rb +29 -15
- data/lib/sequel/plugins/schema.rb +7 -2
- data/lib/sequel/plugins/serialization.rb +98 -49
- data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
- data/lib/sequel/plugins/sharding.rb +21 -54
- data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
- data/lib/sequel/plugins/static_cache.rb +99 -0
- data/lib/sequel/plugins/subclasses.rb +10 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +9 -12
- data/lib/sequel/plugins/update_primary_key.rb +2 -2
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +15 -4
- data/lib/sequel/sql.rb +526 -59
- data/lib/sequel/timezones.rb +57 -38
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +146 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +142 -40
- data/spec/adapters/mysql_spec.rb +380 -234
- data/spec/adapters/oracle_spec.rb +67 -77
- data/spec/adapters/postgres_spec.rb +1050 -212
- data/spec/adapters/spec_helper.rb +8 -5
- data/spec/adapters/sqlite_spec.rb +139 -27
- data/spec/core/connection_pool_spec.rb +196 -93
- data/spec/core/database_spec.rb +879 -510
- data/spec/core/dataset_spec.rb +1415 -1086
- data/spec/core/expression_filters_spec.rb +554 -109
- data/spec/core/mock_adapter_spec.rb +449 -0
- data/spec/core/object_graph_spec.rb +86 -114
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +482 -38
- data/spec/core/spec_helper.rb +6 -48
- data/spec/extensions/active_model_spec.rb +13 -0
- data/spec/extensions/arbitrary_servers_spec.rb +110 -0
- data/spec/extensions/association_autoreloading_spec.rb +18 -10
- data/spec/extensions/association_dependencies_spec.rb +15 -25
- data/spec/extensions/association_pks_spec.rb +66 -32
- data/spec/extensions/association_proxies_spec.rb +4 -4
- data/spec/extensions/caching_spec.rb +47 -51
- data/spec/extensions/class_table_inheritance_spec.rb +31 -83
- data/spec/extensions/columns_introspection_spec.rb +91 -0
- data/spec/extensions/composition_spec.rb +18 -13
- data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
- data/spec/extensions/dataset_associations_spec.rb +199 -0
- data/spec/extensions/defaults_setter_spec.rb +64 -0
- data/spec/extensions/dirty_spec.rb +155 -0
- data/spec/extensions/eager_each_spec.rb +34 -0
- data/spec/extensions/force_encoding_spec.rb +4 -2
- data/spec/extensions/hook_class_methods_spec.rb +69 -92
- data/spec/extensions/identity_map_spec.rb +131 -22
- data/spec/extensions/inflector_spec.rb +0 -4
- data/spec/extensions/instance_filters_spec.rb +11 -21
- data/spec/extensions/instance_hooks_spec.rb +72 -0
- data/spec/extensions/json_serializer_spec.rb +49 -6
- data/spec/extensions/lazy_attributes_spec.rb +16 -20
- data/spec/extensions/list_spec.rb +48 -39
- data/spec/extensions/many_through_many_spec.rb +283 -250
- data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
- data/spec/extensions/migration_spec.rb +140 -35
- data/spec/extensions/named_timezones_spec.rb +29 -11
- data/spec/extensions/nested_attributes_spec.rb +251 -89
- data/spec/extensions/null_dataset_spec.rb +85 -0
- data/spec/extensions/optimistic_locking_spec.rb +24 -21
- data/spec/extensions/pg_array_ops_spec.rb +105 -0
- data/spec/extensions/pg_array_spec.rb +196 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
- data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
- data/spec/extensions/pg_hstore_spec.rb +195 -0
- data/spec/extensions/pg_inet_spec.rb +44 -0
- data/spec/extensions/pg_json_spec.rb +101 -0
- data/spec/extensions/pg_statement_cache_spec.rb +209 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
- data/spec/extensions/prepared_statements_spec.rb +87 -0
- data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
- data/spec/extensions/pretty_table_spec.rb +7 -6
- data/spec/extensions/query_literals_spec.rb +168 -0
- data/spec/extensions/query_spec.rb +6 -0
- data/spec/extensions/rcte_tree_spec.rb +50 -43
- data/spec/extensions/schema_caching_spec.rb +41 -0
- data/spec/extensions/schema_dumper_spec.rb +429 -22
- data/spec/extensions/schema_spec.rb +25 -21
- data/spec/extensions/select_remove_spec.rb +38 -0
- data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
- data/spec/extensions/serialization_spec.rb +85 -43
- data/spec/extensions/server_block_spec.rb +90 -0
- data/spec/extensions/sharding_spec.rb +69 -143
- data/spec/extensions/single_table_inheritance_spec.rb +23 -29
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +22 -61
- data/spec/extensions/sql_expr_spec.rb +29 -60
- data/spec/extensions/static_cache_spec.rb +145 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
- data/spec/extensions/thread_local_timezones_spec.rb +22 -2
- data/spec/extensions/timestamps_spec.rb +6 -6
- data/spec/extensions/to_dot_spec.rb +4 -7
- data/spec/extensions/touch_spec.rb +13 -14
- data/spec/extensions/tree_spec.rb +11 -26
- data/spec/extensions/typecast_on_load_spec.rb +9 -6
- data/spec/extensions/update_primary_key_spec.rb +30 -24
- data/spec/extensions/validation_class_methods_spec.rb +30 -51
- data/spec/extensions/validation_helpers_spec.rb +16 -35
- data/spec/extensions/xml_serializer_spec.rb +29 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
- data/spec/integration/associations_test.rb +659 -21
- data/spec/integration/database_test.rb +9 -3
- data/spec/integration/dataset_test.rb +605 -91
- data/spec/integration/eager_loader_test.rb +19 -21
- data/spec/integration/migrator_test.rb +2 -3
- data/spec/integration/model_test.rb +81 -2
- data/spec/integration/plugin_test.rb +454 -143
- data/spec/integration/prepared_statement_test.rb +263 -128
- data/spec/integration/schema_test.rb +309 -43
- data/spec/integration/spec_helper.rb +40 -30
- data/spec/integration/timezone_test.rb +38 -12
- data/spec/integration/transaction_test.rb +183 -8
- data/spec/integration/type_test.rb +18 -4
- data/spec/model/association_reflection_spec.rb +201 -7
- data/spec/model/associations_spec.rb +1067 -661
- data/spec/model/base_spec.rb +329 -95
- data/spec/model/dataset_methods_spec.rb +7 -27
- data/spec/model/eager_loading_spec.rb +677 -676
- data/spec/model/hooks_spec.rb +349 -67
- data/spec/model/model_spec.rb +240 -168
- data/spec/model/plugins_spec.rb +24 -13
- data/spec/model/record_spec.rb +490 -232
- data/spec/model/spec_helper.rb +14 -71
- data/spec/model/validations_spec.rb +11 -0
- data/spec/rcov.opts +2 -0
- metadata +178 -80
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# The sql_expr extension adds the sql_expr method to every object, which
|
|
2
|
-
# returns an object that works nicely with Sequel's DSL
|
|
3
|
-
#
|
|
2
|
+
# returns an wrapped object that works nicely with Sequel's DSL by calling
|
|
3
|
+
# Sequel.expr:
|
|
4
4
|
#
|
|
5
5
|
# 1.sql_expr < :a # 1 < a
|
|
6
6
|
# false.sql_expr & :a # FALSE AND a
|
|
@@ -8,115 +8,9 @@
|
|
|
8
8
|
# ~nil.sql_expr # NOT NULL
|
|
9
9
|
# "a".sql_expr + "b" # 'a' || 'b'
|
|
10
10
|
|
|
11
|
-
module Sequel
|
|
12
|
-
module SQL
|
|
13
|
-
# The GenericComplexExpression acts like a
|
|
14
|
-
# GenericExpression in terms of methods,
|
|
15
|
-
# but has an internal structure of a
|
|
16
|
-
# ComplexExpression. It is used by Object#sql_expr.
|
|
17
|
-
# Since we don't know what specific type of object
|
|
18
|
-
# we are dealing with it, we treat it similarly to
|
|
19
|
-
# how we treat symbols or literal strings, allowing
|
|
20
|
-
# many different types of methods.
|
|
21
|
-
class GenericComplexExpression < ComplexExpression
|
|
22
|
-
include AliasMethods
|
|
23
|
-
include BooleanMethods
|
|
24
|
-
include CastMethods
|
|
25
|
-
include ComplexExpressionMethods
|
|
26
|
-
include InequalityMethods
|
|
27
|
-
include NumericMethods
|
|
28
|
-
include OrderMethods
|
|
29
|
-
include StringMethods
|
|
30
|
-
include SubscriptMethods
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
11
|
class Object
|
|
36
|
-
# Return
|
|
37
|
-
# Sequel::SQL::GenericComplexExpression. Allows easy use
|
|
38
|
-
# of the Object with Sequel's DSL. You'll probably have
|
|
39
|
-
# to make sure that Sequel knows how to literalize the
|
|
40
|
-
# object properly, though.
|
|
41
|
-
def sql_expr
|
|
42
|
-
Sequel::SQL::GenericComplexExpression.new(:NOOP, self)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
class FalseClass
|
|
47
|
-
# Returns a copy of the object wrapped in a
|
|
48
|
-
# Sequel::SQL::BooleanExpression, allowing easy use
|
|
49
|
-
# of Sequel's DSL:
|
|
50
|
-
#
|
|
51
|
-
# false.sql_expr & :a # FALSE AND a
|
|
52
|
-
def sql_expr
|
|
53
|
-
Sequel::SQL::BooleanExpression.new(:NOOP, self)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
class NilClass
|
|
58
|
-
# Returns a copy of the object wrapped in a
|
|
59
|
-
# Sequel::SQL::BooleanExpression, allowing easy use
|
|
60
|
-
# of Sequel's DSL:
|
|
61
|
-
#
|
|
62
|
-
# ~nil.sql_expr # NOT NULL
|
|
63
|
-
def sql_expr
|
|
64
|
-
Sequel::SQL::BooleanExpression.new(:NOOP, self)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
class Numeric
|
|
69
|
-
# Returns a copy of the object wrapped in a
|
|
70
|
-
# Sequel::SQL::NumericExpression, allowing easy use
|
|
71
|
-
# of Sequel's DSL:
|
|
72
|
-
#
|
|
73
|
-
# 1.sql_expr < :a # 1 < a
|
|
74
|
-
def sql_expr
|
|
75
|
-
Sequel::SQL::NumericExpression.new(:NOOP, self)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
class Proc
|
|
80
|
-
# Evaluates the proc as a virtual row block.
|
|
81
|
-
# If a hash or array of two element arrays is returned,
|
|
82
|
-
# they are converted to a Sequel::SQL::BooleanExpression. Otherwise,
|
|
83
|
-
# unless the object returned is already an Sequel::SQL::Expression,
|
|
84
|
-
# convert the object to an Sequel::SQL::GenericComplexExpression.
|
|
85
|
-
#
|
|
86
|
-
# proc{a(b)}.sql_expr + 1 # a(b) + 1
|
|
87
|
-
# proc{{a=>b}}.sql_expr | true # (a = b) OR TRUE
|
|
88
|
-
# proc{1}.sql_expr + :a # 1 + a
|
|
89
|
-
def sql_expr
|
|
90
|
-
o = Sequel.virtual_row(&self)
|
|
91
|
-
if Sequel.condition_specifier?(o)
|
|
92
|
-
Sequel::SQL::BooleanExpression.from_value_pairs(o, :AND)
|
|
93
|
-
elsif o.is_a?(Sequel::SQL::Expression)
|
|
94
|
-
o
|
|
95
|
-
else
|
|
96
|
-
Sequel::SQL::GenericComplexExpression.new(:NOOP, o)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
class String
|
|
102
|
-
# Returns a copy of the object wrapped in a
|
|
103
|
-
# Sequel::SQL::StringExpression, allowing easy use
|
|
104
|
-
# of Sequel's DSL:
|
|
105
|
-
#
|
|
106
|
-
# "a".sql_expr + :a # 'a' || a
|
|
12
|
+
# Return the object wrapper in an appropriate Sequel expression object.
|
|
107
13
|
def sql_expr
|
|
108
|
-
Sequel
|
|
14
|
+
Sequel.expr(self)
|
|
109
15
|
end
|
|
110
16
|
end
|
|
111
|
-
|
|
112
|
-
class TrueClass
|
|
113
|
-
# Returns a copy of the object wrapped in a
|
|
114
|
-
# Sequel::SQL::BooleanExpression, allowing easy use
|
|
115
|
-
# of Sequel's DSL:
|
|
116
|
-
#
|
|
117
|
-
# true.sql_expr | :a # TRUE OR a
|
|
118
|
-
def sql_expr
|
|
119
|
-
Sequel::SQL::BooleanExpression.new(:NOOP, self)
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
@@ -32,7 +32,7 @@ module Sequel
|
|
|
32
32
|
module ThreadLocalTimezones
|
|
33
33
|
%w'application database typecast'.each do |t|
|
|
34
34
|
class_eval("def thread_#{t}_timezone=(tz); Thread.current[:#{t}_timezone] = convert_timezone_setter_arg(tz); end", __FILE__, __LINE__)
|
|
35
|
-
class_eval(<<END, __FILE__, __LINE__)
|
|
35
|
+
class_eval(<<END, __FILE__, __LINE__ + 1)
|
|
36
36
|
def #{t}_timezone
|
|
37
37
|
if tz = Thread.current[:#{t}_timezone]
|
|
38
38
|
tz unless tz == :nil
|
|
@@ -4,109 +4,111 @@
|
|
|
4
4
|
# of the dataset's abstract syntax tree.
|
|
5
5
|
|
|
6
6
|
module Sequel
|
|
7
|
-
class
|
|
7
|
+
class ToDot
|
|
8
8
|
# The option keys that should be included in the dot output.
|
|
9
9
|
TO_DOT_OPTIONS = [:with, :distinct, :select, :from, :join, :where, :group, :having, :compounds, :order, :limit, :offset, :lock].freeze
|
|
10
10
|
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
# Given a +Dataset+, return a string in +dot+ format that will
|
|
12
|
+
# generate a visualization of the dataset.
|
|
13
|
+
def self.output(ds)
|
|
14
|
+
new(ds).output
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Given a +Dataset+, parse the internal structure to generate
|
|
18
|
+
# a dataset visualization.
|
|
19
|
+
def initialize(ds)
|
|
20
|
+
@i = 0
|
|
21
|
+
@stack = [@i]
|
|
22
|
+
@dot = ["digraph G {", "0 [label=\"self\"];"]
|
|
23
|
+
v(ds, "")
|
|
24
|
+
@dot << "}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Output the dataset visualization as a string in +dot+ format.
|
|
28
|
+
def output
|
|
29
|
+
@dot.join("\n")
|
|
20
30
|
end
|
|
21
31
|
|
|
22
32
|
private
|
|
23
33
|
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# its children are then added by recursively calling this method. The
|
|
39
|
-
# return value is the integer representing the last created node.
|
|
40
|
-
def _to_dot(dot, l, c, e, i)
|
|
41
|
-
i += 1
|
|
42
|
-
dot << "#{c} -> #{i} [label=\"#{l}\"];" if l
|
|
43
|
-
c = i
|
|
34
|
+
# Add an entry to the +dot+ output with the given label. If +j+
|
|
35
|
+
# is given, it is used directly as the node or transition. Otherwise
|
|
36
|
+
# a node is created for the current object.
|
|
37
|
+
def dot(label, j=nil)
|
|
38
|
+
@dot << "#{j||@i} [label=#{label.to_s.inspect}];"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Recursive method that parses all of Sequel's internal datastructures,
|
|
42
|
+
# adding the appropriate nodes and transitions to the internal +dot+
|
|
43
|
+
# structure.
|
|
44
|
+
def v(e, l)
|
|
45
|
+
@i += 1
|
|
46
|
+
dot(l, "#{@stack.last} -> #{@i}") if l
|
|
47
|
+
@stack.push(@i)
|
|
44
48
|
case e
|
|
45
49
|
when LiteralString
|
|
46
|
-
dot
|
|
47
|
-
i
|
|
50
|
+
dot "#{e.inspect}.lit" # core_sql use
|
|
48
51
|
when Symbol, Numeric, String, Class, TrueClass, FalseClass, NilClass
|
|
49
|
-
dot
|
|
50
|
-
i
|
|
52
|
+
dot e.inspect
|
|
51
53
|
when Array
|
|
52
|
-
dot
|
|
53
|
-
e.each_with_index do |
|
|
54
|
-
|
|
54
|
+
dot "Array"
|
|
55
|
+
e.each_with_index do |val, j|
|
|
56
|
+
v(val, j)
|
|
55
57
|
end
|
|
56
58
|
when Hash
|
|
57
|
-
dot
|
|
58
|
-
e.each do |k,
|
|
59
|
-
|
|
59
|
+
dot "Hash"
|
|
60
|
+
e.each do |k, val|
|
|
61
|
+
v(val, k)
|
|
60
62
|
end
|
|
61
63
|
when SQL::ComplexExpression
|
|
62
|
-
dot
|
|
63
|
-
e.args.each_with_index do |
|
|
64
|
-
|
|
64
|
+
dot "ComplexExpression: #{e.op}"
|
|
65
|
+
e.args.each_with_index do |val, j|
|
|
66
|
+
v(val, j)
|
|
65
67
|
end
|
|
66
68
|
when SQL::Identifier
|
|
67
|
-
dot
|
|
68
|
-
|
|
69
|
+
dot "Identifier"
|
|
70
|
+
v(e.value, :value)
|
|
69
71
|
when SQL::QualifiedIdentifier
|
|
70
|
-
dot
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
dot "QualifiedIdentifier"
|
|
73
|
+
v(e.table, :table)
|
|
74
|
+
v(e.column, :column)
|
|
73
75
|
when SQL::OrderedExpression
|
|
74
|
-
dot
|
|
75
|
-
|
|
76
|
+
dot "OrderedExpression: #{e.descending ? :DESC : :ASC}#{" NULLS #{e.nulls.to_s.upcase}" if e.nulls}"
|
|
77
|
+
v(e.expression, :expression)
|
|
76
78
|
when SQL::AliasedExpression
|
|
77
|
-
dot
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
dot "AliasedExpression"
|
|
80
|
+
v(e.expression, :expression)
|
|
81
|
+
v(e.aliaz, :alias)
|
|
80
82
|
when SQL::CaseExpression
|
|
81
|
-
dot
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
dot "CaseExpression"
|
|
84
|
+
v(e.expression, :expression) if e.expression
|
|
85
|
+
v(e.conditions, :conditions)
|
|
86
|
+
v(e.default, :default)
|
|
85
87
|
when SQL::Cast
|
|
86
|
-
dot
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
dot "Cast"
|
|
89
|
+
v(e.expr, :expr)
|
|
90
|
+
v(e.type, :type)
|
|
89
91
|
when SQL::Function
|
|
90
|
-
dot
|
|
91
|
-
e.args.each_with_index do |
|
|
92
|
-
|
|
92
|
+
dot "Function: #{e.f}"
|
|
93
|
+
e.args.each_with_index do |val, j|
|
|
94
|
+
v(val, j)
|
|
93
95
|
end
|
|
94
96
|
when SQL::Subscript
|
|
95
|
-
dot
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
dot "Subscript"
|
|
98
|
+
v(e.f, :f)
|
|
99
|
+
v(e.sub, :sub)
|
|
98
100
|
when SQL::WindowFunction
|
|
99
|
-
dot
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
dot "WindowFunction"
|
|
102
|
+
v(e.function, :function)
|
|
103
|
+
v(e.window, :window)
|
|
102
104
|
when SQL::Window
|
|
103
|
-
dot
|
|
104
|
-
|
|
105
|
+
dot "Window"
|
|
106
|
+
v(e.opts, :opts)
|
|
105
107
|
when SQL::PlaceholderLiteralString
|
|
106
108
|
str = e.str
|
|
107
109
|
str = "(#{str})" if e.parens
|
|
108
|
-
dot
|
|
109
|
-
|
|
110
|
+
dot "PlaceholderLiteralString: #{str.inspect}"
|
|
111
|
+
v(e.args, :args)
|
|
110
112
|
when SQL::JoinClause
|
|
111
113
|
str = "#{e.join_type.to_s.upcase} JOIN"
|
|
112
114
|
if e.is_a?(SQL::JoinOnClause)
|
|
@@ -114,24 +116,34 @@ module Sequel
|
|
|
114
116
|
elsif e.is_a?(SQL::JoinUsingClause)
|
|
115
117
|
str << " USING"
|
|
116
118
|
end
|
|
117
|
-
dot
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
dot str
|
|
120
|
+
v(e.table, :table)
|
|
121
|
+
v(e.table_alias, :alias) if e.table_alias
|
|
120
122
|
if e.is_a?(SQL::JoinOnClause)
|
|
121
|
-
|
|
123
|
+
v(e.on, :on)
|
|
122
124
|
elsif e.is_a?(SQL::JoinUsingClause)
|
|
123
|
-
|
|
125
|
+
v(e.using, :using)
|
|
124
126
|
end
|
|
125
127
|
when Dataset
|
|
126
|
-
dot
|
|
128
|
+
dot "Dataset"
|
|
127
129
|
TO_DOT_OPTIONS.each do |k|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
if val = e.opts[k]
|
|
131
|
+
v(val, k.to_s)
|
|
132
|
+
end
|
|
130
133
|
end
|
|
131
134
|
else
|
|
132
|
-
dot
|
|
135
|
+
dot "Unhandled: #{e.inspect}"
|
|
133
136
|
end
|
|
134
|
-
|
|
137
|
+
@stack.pop
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
class Dataset
|
|
142
|
+
# Return a string that can be processed by the +dot+ program (included
|
|
143
|
+
# with graphviz) in order to see a visualization of the dataset's
|
|
144
|
+
# abstract syntax tree.
|
|
145
|
+
def to_dot
|
|
146
|
+
ToDot.output(self)
|
|
135
147
|
end
|
|
136
148
|
end
|
|
137
149
|
end
|