ddl_parser 0.0.14 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- data/Vagrantfile +65 -9
- data/lib/ddl_parser/ddl/db2/parser.rb +2 -2
- data/lib/ddl_parser/translator/create_index_column.rb +1 -1
- data/lib/ddl_parser/translator/create_index_header.rb +4 -8
- data/lib/ddl_parser/version.rb +1 -1
- data/spec/ddl_parser/ddl/db2/create_index_header_spec.rb +39 -14
- data/spec/ddl_parser/parser_spec.rb +26 -5
- data/spec/ddl_parser/translator/index_header_spec.rb +1 -2
- metadata +2 -2
data/Vagrantfile
CHANGED
@@ -1,9 +1,65 @@
|
|
1
|
-
# -*- mode: ruby -*-
|
2
|
-
# vi: set ft=ruby :
|
3
|
-
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
# -----
|
5
|
+
$script = <<SCRIPT
|
6
|
+
set -e
|
7
|
+
set -x
|
8
|
+
|
9
|
+
cd
|
10
|
+
sudo apt-get update -y
|
11
|
+
sudo apt-get install \
|
12
|
+
git-core \
|
13
|
+
curl \
|
14
|
+
zlib1g-dev\
|
15
|
+
build-essential\
|
16
|
+
libssl-dev\
|
17
|
+
libreadline-dev\
|
18
|
+
libyaml-dev\
|
19
|
+
libsqlite3-dev\
|
20
|
+
sqlite3\
|
21
|
+
libxml2-dev\
|
22
|
+
libxslt1-dev\
|
23
|
+
libcurl4-openssl-dev\
|
24
|
+
python-software-properties \
|
25
|
+
-y 2> /dev/null
|
26
|
+
|
27
|
+
# install rbenv
|
28
|
+
rm -rf ~/.rbenv
|
29
|
+
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
|
30
|
+
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
|
31
|
+
|
32
|
+
# Setup rbenv paths
|
33
|
+
pathstring='export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/plugins/ruby-build/bin:$PATH"'
|
34
|
+
eval $pathstring
|
35
|
+
echo $pathstring >> ~/.bashrc
|
36
|
+
|
37
|
+
# Init rbenv
|
38
|
+
initstring='eval "\$(rbenv init -)"'
|
39
|
+
echo $initstring >> ~/.bashrc
|
40
|
+
eval $initstring
|
41
|
+
|
42
|
+
# install ruby
|
43
|
+
rbenv install 1.9.3-p194
|
44
|
+
rbenv global 1.9.3-p194
|
45
|
+
ruby -v
|
46
|
+
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
|
47
|
+
|
48
|
+
# install gems
|
49
|
+
gem install bundler
|
50
|
+
rbenv rehash
|
51
|
+
|
52
|
+
SCRIPT
|
53
|
+
# -----
|
54
|
+
|
55
|
+
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
|
56
|
+
VAGRANTFILE_API_VERSION = "2"
|
57
|
+
|
58
|
+
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
59
|
+
config.vm.box = "ubuntu/trusty32"
|
60
|
+
|
61
|
+
if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id/*").empty?
|
62
|
+
config.vm.provision :shell, inline: $script, privileged: false
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -35,7 +35,7 @@ module DDLParser
|
|
35
35
|
|
36
36
|
rule(:column_definition) { (column_name.as(:field) >> space.repeat >> data_type >> space.repeat >> (column_options.maybe).as(:options)).as(:column)}
|
37
37
|
|
38
|
-
rule(:index_column_definition) { column_name.as(:field) >> (space? >> column_sort.as(:
|
38
|
+
rule(:index_column_definition) { column_name.as(:field) >> (space? >> column_sort.as(:sort_type) >> space.repeat).maybe }
|
39
39
|
|
40
40
|
rule(:element_list) { (lparen >> space? >> (column_definition | constraint | primary_key) >> space? >>
|
41
41
|
(comma >> space? >> (column_definition | constraint | primary_key) >> space?).repeat >> rparen).as(:elements)
|
@@ -83,7 +83,7 @@ module DDLParser
|
|
83
83
|
}
|
84
84
|
# index options
|
85
85
|
|
86
|
-
rule(:option_reverse_scans) { str('allow reverse scans')
|
86
|
+
rule(:option_reverse_scans) { str('allow reverse scans').as(:reverse_scans_property)}
|
87
87
|
rule(:index_option) { (option_reverse_scans).as(:index_option) }
|
88
88
|
|
89
89
|
rule(:item) { function | identifier | string }
|
@@ -6,7 +6,7 @@ class DDLParser::Translator::CreateIndexHeader
|
|
6
6
|
def initialize(index_hash)
|
7
7
|
if index_hash.is_a?(Hash) and index_hash.count > 1
|
8
8
|
@index_head = index_hash
|
9
|
-
@index_columns = [{:field =>index_hash[:field], :
|
9
|
+
@index_columns = [{:field =>index_hash[:field], :sort_type => index_hash[:sort_type]}]
|
10
10
|
else
|
11
11
|
if index_hash.is_a?(Array) and index_hash.count > 1
|
12
12
|
@index_head = index_hash.first.is_a?(Hash) ? index_hash.first : {}
|
@@ -27,15 +27,11 @@ class DDLParser::Translator::CreateIndexHeader
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def index_name
|
30
|
-
@index_head[:index_name]
|
31
|
-
end
|
32
|
-
|
33
|
-
def index_table
|
34
|
-
@index_head[:index_table]
|
30
|
+
@index_head[:index_name].to_s
|
35
31
|
end
|
36
32
|
|
37
33
|
def table_name
|
38
|
-
@index_head[:table_name]
|
34
|
+
@index_head[:table_name].to_s
|
39
35
|
end
|
40
36
|
|
41
37
|
def object_property
|
@@ -43,7 +39,7 @@ class DDLParser::Translator::CreateIndexHeader
|
|
43
39
|
end
|
44
40
|
|
45
41
|
def option_reverse_scans
|
46
|
-
|
42
|
+
index_head.has_key?(:index_option) && index_head[:index_option].has_key?(:reverse_scans_property) ? 'Y' : 'N'
|
47
43
|
end
|
48
44
|
|
49
45
|
def columns
|
data/lib/ddl_parser/version.rb
CHANGED
@@ -51,19 +51,22 @@ EOF
|
|
51
51
|
puts error.cause.ascii_tree
|
52
52
|
end
|
53
53
|
|
54
|
-
result.count.should ==
|
55
|
-
result.should
|
56
|
-
|
57
|
-
result.should include(:
|
58
|
-
result.should include(:
|
59
|
-
result.should include(:
|
60
|
-
result.should include(:
|
54
|
+
result.count.should == 3
|
55
|
+
result.is_a?(Array).should == true
|
56
|
+
|
57
|
+
result[0].should include(:operation => 'create')
|
58
|
+
result[0].should include(:object_property => 'unique')
|
59
|
+
result[0].should include(:object_type => 'index')
|
60
|
+
result[0].should include(:index_name => 'cost_invoice_1')
|
61
|
+
result[0].should include(:table_name => 'cost_invoice')
|
62
|
+
result[1].should include(:field => 'doc_no')
|
63
|
+
result[2].should include(:field => 'doc_no_1')
|
61
64
|
end
|
62
65
|
end
|
63
66
|
context 'element list index' do
|
64
67
|
it 'parses one element' do
|
65
68
|
sql = 'deptno asc'
|
66
|
-
parser.element_list_index.parse(sql).should == {:field=> 'deptno',:
|
69
|
+
parser.element_list_index.parse(sql).should == {:field=> 'deptno',:sort_type=> 'asc'}
|
67
70
|
end
|
68
71
|
it 'parses two element' do
|
69
72
|
sql = 'field1, field2'
|
@@ -77,8 +80,8 @@ EOF
|
|
77
80
|
DEPTNO desc,
|
78
81
|
DEPTNAME asc
|
79
82
|
EOF
|
80
|
-
parser.element_list_index.parse(sql.downcase).should == [{:field=> 'deptno',:
|
81
|
-
{:field=> 'deptname',:
|
83
|
+
parser.element_list_index.parse(sql.downcase).should == [{:field=> 'deptno',:sort_type=> 'desc'},
|
84
|
+
{:field=> 'deptname',:sort_type=> 'asc'}]
|
82
85
|
end
|
83
86
|
end
|
84
87
|
context 'index column definition' do
|
@@ -93,7 +96,7 @@ EOF
|
|
93
96
|
sql = <<EOF
|
94
97
|
DEPTNO descending
|
95
98
|
EOF
|
96
|
-
parser.index_column_definition.parse(sql.downcase).should == {:field=> 'deptno',:
|
99
|
+
parser.index_column_definition.parse(sql.downcase).should == {:field=> 'deptno',:sort_type=> 'descending'}
|
97
100
|
|
98
101
|
end
|
99
102
|
end
|
@@ -103,7 +106,7 @@ EOF
|
|
103
106
|
end
|
104
107
|
it 'parses index_option with reverse scans' do
|
105
108
|
sql = 'allow reverse scans'
|
106
|
-
parser.index_option.parse(sql).should include(:index_option =>
|
109
|
+
parser.index_option.parse(sql).should include(:index_option => {:reverse_scans_property=>"allow reverse scans"})
|
107
110
|
end
|
108
111
|
end
|
109
112
|
context 'create_index_statement' do
|
@@ -141,7 +144,7 @@ EOF
|
|
141
144
|
end
|
142
145
|
end
|
143
146
|
context 'full index example with reverse scan option' do
|
144
|
-
it 'with reverse scan' do
|
147
|
+
it 'with reverse scan 1' do
|
145
148
|
sql = <<EOF
|
146
149
|
CREATE UNIQUE INDEX COST_INVOICE_1
|
147
150
|
ON COST_INVOICE
|
@@ -160,7 +163,7 @@ EOF
|
|
160
163
|
result.should include(:index_name => 'cost_invoice_1')
|
161
164
|
result.should include(:table_name => 'cost_invoice')
|
162
165
|
result.should include(:field => 'doc_no')
|
163
|
-
result.should include(:index_option =>
|
166
|
+
result.should include(:index_option => {:reverse_scans_property=>"allow reverse scans"})
|
164
167
|
|
165
168
|
end
|
166
169
|
it 'without reverse scan' do
|
@@ -182,6 +185,28 @@ EOF
|
|
182
185
|
result.should include(:table_name => 'cost_invoice')
|
183
186
|
result.should include(:field => 'doc_no')
|
184
187
|
|
188
|
+
end
|
189
|
+
it 'with reverse scan 2' do
|
190
|
+
sql = <<EOF
|
191
|
+
CREATE INDEX PL_TRIGGER_I2
|
192
|
+
ON PL_TRIGGER
|
193
|
+
(UNIQUE_NO)
|
194
|
+
ALLOW REVERSE SCANS
|
195
|
+
EOF
|
196
|
+
begin
|
197
|
+
result = parser.parse(sql.downcase)
|
198
|
+
rescue Parslet::ParseFailed => error
|
199
|
+
puts error.cause.ascii_tree
|
200
|
+
end
|
201
|
+
result.count.should == 6
|
202
|
+
result.should include(:operation => 'create')
|
203
|
+
result.should include(:object_type => 'index')
|
204
|
+
result.should include(:index_name => 'pl_trigger_i2')
|
205
|
+
result.should include(:table_name => 'pl_trigger')
|
206
|
+
result.should include(:field => 'unique_no')
|
207
|
+
result.should include(:index_option => {:reverse_scans_property=>"allow reverse scans"})
|
208
|
+
|
209
|
+
|
185
210
|
end
|
186
211
|
it 'live example' do
|
187
212
|
sql = <<EOF
|
@@ -59,7 +59,7 @@ describe 'DDLParser::Parser' do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
context 'alter table translate' do
|
62
|
+
context 'alter table add column translate' do
|
63
63
|
let(:sql) {
|
64
64
|
sql = <<EOF
|
65
65
|
ALTER TABLE BUDGET
|
@@ -75,7 +75,7 @@ EOF
|
|
75
75
|
end
|
76
76
|
|
77
77
|
|
78
|
-
it 'translate columns' do
|
78
|
+
it 'translate columns xxx' do
|
79
79
|
parser = DDLParser::Parser.new(sql)
|
80
80
|
parser.translate.add_columns.map(&:to_hash).should == [{:field=> 'budget_amount_in_co',
|
81
81
|
:data_type=>{:decimal=>{:precision=>{:total=>{:integer=> '15'}, :scale=>{:integer=> '2'}}}},
|
@@ -106,11 +106,11 @@ EOF
|
|
106
106
|
@parser.translate.index_name.should == 'replan_addr_1'
|
107
107
|
end
|
108
108
|
it 'columns' do
|
109
|
-
@parser.translate.columns.map(&:to_hash).should == [{:field=>"consignment", :
|
109
|
+
@parser.translate.columns.map(&:to_hash).should == [{:field=>"consignment", :sort_type=>"ascending"}, {:field=>"colli", :sort_type=>"descending"}]
|
110
110
|
end
|
111
111
|
|
112
112
|
end
|
113
|
-
context 'create index translate one index column' do
|
113
|
+
context 'create index translate one index column allow not reverse scans' do
|
114
114
|
before :each do
|
115
115
|
sql = 'CREATE UNIQUE INDEX REPLAN_ADDR_1 ON REPLAN_ADDR (CONSIGNMENT ASCENDING)'
|
116
116
|
@parser = DDLParser::Parser.new(sql)
|
@@ -123,11 +123,32 @@ EOF
|
|
123
123
|
@parser.translate.index_name.should == 'replan_addr_1'
|
124
124
|
end
|
125
125
|
it 'columns' do
|
126
|
-
@parser.translate.columns.map(&:to_hash).should == [{:field=>"consignment", :
|
126
|
+
@parser.translate.columns.map(&:to_hash).should == [{:field=>"consignment", :sort_type=>"ascending"}]
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'allow not reverse scans 1' do
|
130
|
+
@parser.translate.option_reverse_scans.should == 'N'
|
127
131
|
end
|
128
132
|
|
129
133
|
end
|
134
|
+
context 'create index translate one index column allow reverse scans' do
|
135
|
+
before :each do
|
136
|
+
sql = 'CREATE UNIQUE INDEX REPLAN_ADDR_1 ON REPLAN_ADDR (CONSIGNMENT ASCENDING) ALLOW REVERSE SCANS'
|
137
|
+
@parser = DDLParser::Parser.new(sql)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'table name' do
|
141
|
+
@parser.translate.table_name.should == 'replan_addr'
|
142
|
+
end
|
143
|
+
it 'index name' do
|
144
|
+
@parser.translate.index_name.should == 'replan_addr_1'
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'allow reverse scans 1' do
|
148
|
+
@parser.translate.option_reverse_scans.should == 'Y'
|
149
|
+
end
|
130
150
|
|
151
|
+
end
|
131
152
|
context 'report errors' do
|
132
153
|
it 'misses right parant' do
|
133
154
|
sql = "Create table USER (FOO CHAR(4) NOT NULL, BAR CHAR(4) NOT NULL"
|
@@ -31,10 +31,9 @@ end
|
|
31
31
|
|
32
32
|
it 'should return name' do
|
33
33
|
unique_no_column.index_name.should == 'test_index'
|
34
|
-
unique_no_column.index_table.should == 'on test_table'
|
35
34
|
unique_no_column.table_name.should == 'test_table'
|
36
35
|
unique_no_column.object_property.should == 'unique'
|
37
|
-
unique_no_column.option_reverse_scans.should == '
|
36
|
+
unique_no_column.option_reverse_scans.should == 'N'
|
38
37
|
end
|
39
38
|
|
40
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddl_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parslet
|