-
Notifications
You must be signed in to change notification settings - Fork 29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix dumping expression indexes #27
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -44,6 +44,54 @@ def tables(_) | |
end | ||
end | ||
|
||
TABLE_COLUMN_MATCHES = [ | ||
[ # first match expression index case | ||
%r{ | ||
^ | ||
t\.index \s* | ||
"(?<index_cols>(?:[^"\\]|\\.)*?)" \s* | ||
, \s* | ||
name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s* | ||
,? \s* | ||
(?<options>.*) | ||
$ | ||
}x, | ||
->(m) { | ||
index_cols = m[:index_cols].gsub('\\"', '"') | ||
SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{" + m[:options] + "}") | ||
} | ||
], | ||
[ # general matching of columns | ||
%r{ | ||
^ | ||
t\.(?<type>\S+) \s* | ||
[:'"](?<name>[^"\s]+)[,"]? \s* | ||
,? \s* | ||
(?<options>.*) | ||
$ | ||
}x, | ||
->(m) { | ||
SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: [] | ||
} | ||
], | ||
[ # index definitions with multiple columns | ||
%r{ | ||
^ | ||
t\.index \s* | ||
\[(?<index_cols>.*?)\] \s* | ||
, \s* | ||
name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s* | ||
,? \s* | ||
(?<options>.*) | ||
$ | ||
}x, | ||
->(m) { | ||
index_cols = m[:index_cols].tr(%q{'":}, '').strip.split(/\s*,\s*/) | ||
SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{#{m[:options]}}") | ||
} | ||
] | ||
].freeze | ||
|
||
def table(table, _) | ||
SchemaMonkey::Middleware::Dumper::Table.start(dumper: self, connection: @connection, dump: @dump, table: @dump.tables[table] = SchemaDump::Table.new(name: table)) do |env| | ||
stream = StringIO.new | ||
|
@@ -68,34 +116,13 @@ def table(table, _) | |
env.table.trailer = m[:trailer].split("\n").map(&:strip).reject{|s| s.blank?} | ||
table_objects = m[:columns].strip.split("\n").map { |col| | ||
cs = col.strip | ||
m = cs.match %r{ | ||
^ | ||
t\.(?<type>\S+) \s* | ||
[:'"](?<name>[^"\s]+)[,"]? \s* | ||
,? \s* | ||
(?<options>.*) | ||
$ | ||
}x | ||
if !m.nil? | ||
SchemaDump::Table::Column.new name: m[:name], type: m[:type], options: eval("{" + m[:options] + "}"), comments: [] | ||
else | ||
m = cs.match %r{ | ||
^ | ||
t\.index \s* | ||
\[(?<index_cols>.*?)\] \s* | ||
, \s* | ||
name\: \s* [:'"](?<name>[^"\s]+)[,"]? \s* | ||
,? \s* | ||
(?<options>.*) | ||
$ | ||
}x | ||
if m.nil? | ||
nil | ||
else | ||
index_cols = m[:index_cols].tr(%q{'":}, '').strip.split(/\s*,\s*/) | ||
SchemaDump::Table::Index.new name: m[:name], columns: index_cols, options: eval("{#{m[:options]}}") | ||
end | ||
result = nil | ||
# find the first regex that matches and grab the column definition | ||
TABLE_COLUMN_MATCHES.find do |(r, l)| | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think result = nil
TABILE_COLUMN_MATCHES.find do |(r, l)|
m = cs.match(r)
result = ...
end
result is equivalent to TABLE_COLUMN_MATCHES.find do |(r, l)|
m = cs.match(r)
!m.nil? && l.call(m) # or l.call(m) unless m.nil?
end There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it's actually not.. as "find" returns the entry.. not the result of the block. (as I had that first and all tests failed) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oops. I'll accept this. This seems non-obvious though 🤔 |
||
m = cs.match r | ||
result = m.nil? ? nil : l.call(m) | ||
end | ||
result | ||
}.reject { |o| o.nil? } | ||
env.table.columns = table_objects.select { |o| o.is_a? SchemaDump::Table::Column } | ||
env.table.indexes = table_objects.select { |o| o.is_a? SchemaDump::Table::Index } | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
module SchemaPlus | ||
module Core | ||
VERSION = "2.2.2" | ||
VERSION = "2.2.3" | ||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At this point I think it's worth splitting up to different functions for each arity. This seems rather convoluted...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's all about priority of matching here.. as I have the expression index case, the generic case, and the column case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
once thought I could do, is extract it out into a CONST array of regex/lambda and reduce this block to just iterating those.. Then it'll be a little cleaner? e.g.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that would be awesome, thanks @urkle!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@lowjoel take a look now..