Module: ActiveVersion::Revisions::SQLBuilder::ClassMethods
- Defined in:
- lib/active_version/revisions/sql_builder.rb
Defined Under Namespace
Classes: BatchCollector
Instance Method Summary collapse
-
#batch_insert(records = nil, options = {}, &block) ⇒ Integer
Execute batch insert SQL for revisions.
-
#batch_insert_sql(records = nil, options = {}, &block) ⇒ String
Generate SQL for batch insert of revisions.
-
#batch_upsert_sql(records, options = {}) ⇒ Object
Generate SQL for batch upsert of revisions.
Instance Method Details
#batch_insert(records = nil, options = {}, &block) ⇒ Integer
Execute batch insert SQL for revisions. Supports the same arguments and block semantics as batch_insert_sql.
126 127 128 129 130 131 |
# File 'lib/active_version/revisions/sql_builder.rb', line 126 def batch_insert(records = nil, = {}, &block) sql = batch_insert_sql(records, , &block) return 0 if sql.empty? connection.execute(sql) end |
#batch_insert_sql(records = nil, options = {}, &block) ⇒ String
Generate SQL for batch insert of revisions
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/active_version/revisions/sql_builder.rb', line 38 def batch_insert_sql(records = nil, = {}, &block) records, = normalize_batch_arguments(records, ) captured_values = [] block_consumed = false if block_given? && Array(records).flatten.compact.empty? collected = [] captured_values = capture_revision_values() do if block.arity == 1 yield(BatchCollector.new(collected)) else yield end end records = collected block_consumed = true end if Array(records).flatten.compact.empty? && captured_values.any? revision_class = self version_column = revision_class.revision_column_for(:version) conflict_target = Array(revision_class.source_foreign_key) + [version_column] if [:combine] != false return build_combined_insert_sql( revision_class, captured_values, upsert: [:upsert] == true, conflict_target: conflict_target ) end return captured_values.map do |values| build_single_insert_sql( revision_class, values, upsert: [:upsert] == true, conflict_target: conflict_target ) end.join(";\n") end records = if block_consumed Array(records).flatten.compact else resolve_batch_records(records, &block) end return "" if records.empty? revision_class = records.first.class.revision_class return "" unless revision_class version = [:version] || 1 upsert = [:upsert] == true foreign_keys = Array(revision_class.source_foreign_key) version_column = ActiveVersion.column_mapper.column_for(records.first.class, :revisions, :version) # Build values for each record values_list = records.map do |record| build_batch_revision_values(record, revision_class, foreign_keys, version_column, version, ) end.compact return "" if values_list.empty? # Combine into single INSERT with multiple VALUES if [:combine] != false build_combined_insert_sql( revision_class, values_list, upsert: upsert, conflict_target: foreign_keys + [version_column] ) else # Return separate INSERT statements values_list.map do |values| build_single_insert_sql( revision_class, values, upsert: upsert, conflict_target: foreign_keys + [version_column] ) end.join(";\n") end end |
#batch_upsert_sql(records, options = {}) ⇒ Object
Generate SQL for batch upsert of revisions. Uses (source_foreign_key, version_column) conflict target.
135 136 137 |
# File 'lib/active_version/revisions/sql_builder.rb', line 135 def batch_upsert_sql(records, = {}) batch_insert_sql(records, .merge(upsert: true)) end |