grn2drn 1.0.0 → 1.0.1
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.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/bin/grn2drn +22 -15
- data/bin/grn2drn-schema +30 -0
- data/lib/grn2drn/{converter.rb → command-converter.rb} +24 -37
- data/lib/grn2drn/error.rb +19 -0
- data/lib/grn2drn/schema-converter.rb +207 -0
- data/lib/grn2drn/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4940edafe622781d134c34040b00f8334c10dd49
|
4
|
+
data.tar.gz: ee1a8d7a39e90e1f7eea163233c6290aded4ac90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b90c36e609d65ae8555f7176fb38a6236f649ffdb5232e788abf3b5bca542dff3f1ec337e545e7fb89a46ba5ec54256c5074bfae615437c08b7f40c92989c5b4
|
7
|
+
data.tar.gz: 57500ec0df6177e1399641d305deb8903138092c2e17f4d54950b6d71628bd1273e83d1758e27d26af7d618ce2de0a0c940f2eff4b7680948b8cab4ed5c5d005
|
data/README.md
CHANGED
@@ -16,10 +16,27 @@ Grn2drn is a command to convert a *.grn dump file to a JSONs file for Droonga.
|
|
16
16
|
|
17
17
|
## Basic usage
|
18
18
|
|
19
|
+
For migrating Groonga to Droonga:
|
20
|
+
|
21
|
+
```
|
22
|
+
% grndump /path/to/groonga/database > dump.grn
|
23
|
+
% grn2drn --dataset Droonga dump.grn > droonga.jsons
|
24
|
+
```
|
25
|
+
|
26
|
+
You can send the converted data by `droonga-request` or `droonga-send`
|
27
|
+
command. They are included in
|
28
|
+
[droonga-client gem](http://rubygems.org/gems/droonga-client).
|
29
|
+
|
30
|
+
|
31
|
+
For creating [catalog.json](http://droonga.org/reference/catalog/):
|
32
|
+
|
19
33
|
```
|
20
|
-
%
|
34
|
+
% grndump --no-dump-tables /path/to/groonga/database > schema.grn
|
35
|
+
% grn2drn-schema schema.grn > schema.json
|
21
36
|
```
|
22
37
|
|
38
|
+
It generates JSON that can be embedded into catalog.json.
|
39
|
+
|
23
40
|
## Mailing list
|
24
41
|
|
25
42
|
* English: [groonga-talk@lists.sourceforge.net](https://lists.sourceforge.net/lists/listinfo/groonga-talk)
|
data/bin/grn2drn
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
require "ostruct"
|
20
20
|
require "optparse"
|
21
21
|
|
22
|
-
require "grn2drn/converter"
|
22
|
+
require "grn2drn/command-converter"
|
23
23
|
|
24
24
|
options = OpenStruct.new
|
25
25
|
option_parser = OptionParser.new do |parser|
|
@@ -64,28 +64,35 @@ convert_options = {
|
|
64
64
|
:reply_to => options.reply_to,
|
65
65
|
:dataset => options.dataset,
|
66
66
|
}
|
67
|
-
converter = Grn2Drn::
|
67
|
+
converter = Grn2Drn::CommandConverter.new(convert_options)
|
68
68
|
|
69
69
|
source_file = args[0]
|
70
70
|
result_file = args[1]
|
71
71
|
|
72
|
-
|
73
|
-
if source_file.nil?
|
74
|
-
|
75
|
-
else
|
76
|
-
|
72
|
+
def open_input(source_file)
|
73
|
+
if source_file.nil?
|
74
|
+
yield($stdin)
|
75
|
+
else
|
76
|
+
File.open(source_file) do |input|
|
77
|
+
yield(input)
|
78
|
+
end
|
79
|
+
end
|
77
80
|
end
|
78
81
|
|
79
|
-
result_file
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
def open_output(result_file)
|
83
|
+
if result_file.nil?
|
84
|
+
yield($stdout)
|
85
|
+
else
|
86
|
+
File.open("w", result_file) do |output|
|
87
|
+
yield(output)
|
88
|
+
end
|
84
89
|
end
|
85
|
-
|
86
|
-
|
90
|
+
end
|
91
|
+
|
92
|
+
open_input(source_file) do |input|
|
93
|
+
open_output(result_file) do |output|
|
87
94
|
converter.convert(input) do |command|
|
88
|
-
|
95
|
+
output.puts(JSON.generate(command))
|
89
96
|
end
|
90
97
|
end
|
91
98
|
end
|
data/bin/grn2drn-schema
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
#
|
4
|
+
# Copyright (C) 2014 Droonga Project
|
5
|
+
#
|
6
|
+
# This library is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
8
|
+
# License version 2.1 as published by the Free Software Foundation.
|
9
|
+
#
|
10
|
+
# This library is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public
|
16
|
+
# License along with this library; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
|
+
|
19
|
+
require "json"
|
20
|
+
|
21
|
+
require "grn2drn/schema-converter"
|
22
|
+
|
23
|
+
converter = Grn2Drn::SchemaConverter.new
|
24
|
+
begin
|
25
|
+
schema = converter.convert(ARGF)
|
26
|
+
rescue Grn2Drn::Error
|
27
|
+
puts($!.message)
|
28
|
+
exit(false)
|
29
|
+
end
|
30
|
+
puts(JSON.pretty_generate(schema))
|
@@ -22,7 +22,7 @@ require "json"
|
|
22
22
|
require "groonga/command/parser"
|
23
23
|
|
24
24
|
module Grn2Drn
|
25
|
-
class
|
25
|
+
class CommandConverter
|
26
26
|
def initialize(options={})
|
27
27
|
@options = options
|
28
28
|
@count = 0
|
@@ -44,22 +44,13 @@ module Grn2Drn
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
parsed_values = nil
|
48
47
|
parsed_columns = nil
|
49
|
-
@command_parser.on_load_start do |command|
|
50
|
-
parsed_values = []
|
51
|
-
parsed_columns = nil
|
52
|
-
end
|
53
48
|
@command_parser.on_load_columns do |command, columns|
|
54
49
|
parsed_columns = columns
|
55
50
|
end
|
56
51
|
@command_parser.on_load_value do |command, value|
|
57
|
-
|
58
|
-
|
59
|
-
@command_parser.on_load_complete do |command|
|
60
|
-
command[:columns] ||= parsed_columns.join(",") if parsed_columns
|
61
|
-
command[:values] = parsed_values.to_json
|
62
|
-
split_load_command_to_add_commands(command, &block)
|
52
|
+
yield create_add_command(command, parsed_columns, value)
|
53
|
+
command.original_source.clear
|
63
54
|
end
|
64
55
|
|
65
56
|
input.each_line do |line|
|
@@ -123,34 +114,30 @@ module Grn2Drn
|
|
123
114
|
create_message("column_create", command_to_body(command))
|
124
115
|
end
|
125
116
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
body["key"] = value
|
145
|
-
else
|
146
|
-
record_values[column] = value
|
147
|
-
end
|
117
|
+
def create_add_command(command, columns, record)
|
118
|
+
table = command[:table]
|
119
|
+
body = {
|
120
|
+
"table" => table,
|
121
|
+
}
|
122
|
+
|
123
|
+
if record.is_a?(Hash)
|
124
|
+
values = record.dup
|
125
|
+
body["key"] = values.delete("_key")
|
126
|
+
body["values"] = values
|
127
|
+
else
|
128
|
+
values = {}
|
129
|
+
record.each_with_index do |value, column_index|
|
130
|
+
column = columns[column_index]
|
131
|
+
if column == "_key"
|
132
|
+
body["key"] = value
|
133
|
+
else
|
134
|
+
values[column] = value
|
148
135
|
end
|
149
136
|
end
|
150
|
-
body["values"] =
|
151
|
-
|
152
|
-
yield create_message("add", body)
|
137
|
+
body["values"] = values
|
153
138
|
end
|
139
|
+
|
140
|
+
create_message("add", body)
|
154
141
|
end
|
155
142
|
|
156
143
|
def create_select_command(command)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License version 2.1 as published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This library is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
10
|
+
# Lesser General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU Lesser General Public
|
13
|
+
# License along with this library; if not, write to the Free Software
|
14
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
module Grn2Drn
|
17
|
+
class Error < StandardError
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
2
|
+
#
|
3
|
+
# This library is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
5
|
+
# License version 2.1 as published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This library is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
10
|
+
# Lesser General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU Lesser General Public
|
13
|
+
# License along with this library; if not, write to the Free Software
|
14
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
|
+
|
16
|
+
require "groonga/command/parser"
|
17
|
+
|
18
|
+
require "grn2drn/error"
|
19
|
+
|
20
|
+
module Grn2Drn
|
21
|
+
class SchemaConverter
|
22
|
+
class UnknownTable < Error
|
23
|
+
attr_reader :table
|
24
|
+
def initialize(table)
|
25
|
+
@table = table
|
26
|
+
super("Unknown table: <#{@table}>")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(options={})
|
31
|
+
@options = options
|
32
|
+
end
|
33
|
+
|
34
|
+
def convert(input)
|
35
|
+
schema = Schema.new
|
36
|
+
|
37
|
+
command_parser = Groonga::Command::Parser.new
|
38
|
+
command_parser.on_command do |command|
|
39
|
+
case command.name
|
40
|
+
when "table_create"
|
41
|
+
schema.on_table_create_command(command)
|
42
|
+
when "column_create"
|
43
|
+
schema.on_column_create_command(command)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
command_parser.on_load_value do |command, value|
|
48
|
+
command.original_source.clear
|
49
|
+
end
|
50
|
+
|
51
|
+
input.each_line do |line|
|
52
|
+
command_parser << line
|
53
|
+
end
|
54
|
+
command_parser.finish
|
55
|
+
|
56
|
+
schema.to_droonga_schema
|
57
|
+
end
|
58
|
+
|
59
|
+
class Schema
|
60
|
+
def initialize
|
61
|
+
@tables = {}
|
62
|
+
end
|
63
|
+
|
64
|
+
def on_table_create_command(command)
|
65
|
+
@tables[command[:name]] = Table.new(command)
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_column_create_command(command)
|
69
|
+
table_name = command.table
|
70
|
+
table = @tables[table_name]
|
71
|
+
raise UnknownTable.new(table_name) if table.nil?
|
72
|
+
table.add_column(command[:name],
|
73
|
+
Column.new(command))
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_droonga_schema
|
77
|
+
droonga_schema = {}
|
78
|
+
@tables.each do |name, table|
|
79
|
+
droonga_schema[name] = table.to_droonga_schema
|
80
|
+
end
|
81
|
+
droonga_schema
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class Table
|
86
|
+
def initialize(table_create_command)
|
87
|
+
@command = table_create_command
|
88
|
+
@columns = {}
|
89
|
+
end
|
90
|
+
|
91
|
+
def add_column(name, column)
|
92
|
+
@columns[name] = column
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_droonga_schema
|
96
|
+
schema = {}
|
97
|
+
set_schema_item(schema, "type", type)
|
98
|
+
set_schema_item(schema, "keyType", key_type)
|
99
|
+
set_schema_item(schema, "tokenizer", tokenizer)
|
100
|
+
set_schema_item(schema, "normalizer", normalizer)
|
101
|
+
set_schema_item(schema, "columns", droonga_schema_columns)
|
102
|
+
schema
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
def set_schema_item(schema, key, value)
|
107
|
+
return if value.nil?
|
108
|
+
schema[key] = value
|
109
|
+
end
|
110
|
+
|
111
|
+
def type
|
112
|
+
if @command.table_no_key?
|
113
|
+
"Array"
|
114
|
+
elsif @command.table_hash_key?
|
115
|
+
"Hash"
|
116
|
+
elsif @command.table_pat_key?
|
117
|
+
"PatriciaTrie"
|
118
|
+
elsif @command.table_dat_key?
|
119
|
+
"DoubleArrayTrie"
|
120
|
+
else
|
121
|
+
"Hash"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def key_type
|
126
|
+
type = @command.key_type
|
127
|
+
case type
|
128
|
+
when /\AInt/, /\AUInt/
|
129
|
+
"Integer"
|
130
|
+
else
|
131
|
+
type
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def tokenizer
|
136
|
+
@command.default_tokenizer
|
137
|
+
end
|
138
|
+
|
139
|
+
def normalizer
|
140
|
+
@command.normalizer
|
141
|
+
end
|
142
|
+
|
143
|
+
def droonga_schema_columns
|
144
|
+
return nil if @columns.empty?
|
145
|
+
schema = {}
|
146
|
+
@columns.each do |name, column|
|
147
|
+
schema[name] = column.to_droonga_schema
|
148
|
+
end
|
149
|
+
schema
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class Column
|
154
|
+
def initialize(column_create_command)
|
155
|
+
@command = column_create_command
|
156
|
+
end
|
157
|
+
|
158
|
+
def to_droonga_schema
|
159
|
+
schema = {}
|
160
|
+
set_schema_item(schema, "type", type)
|
161
|
+
set_schema_item(schema, "valueType", value_type)
|
162
|
+
set_schema_item(schema, "vectorOptions", vector_options)
|
163
|
+
set_schema_item(schema, "indexOptions", index_options)
|
164
|
+
schema
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
def set_schema_item(schema, key, value)
|
169
|
+
return if value.nil?
|
170
|
+
schema[key] = value
|
171
|
+
end
|
172
|
+
|
173
|
+
def type
|
174
|
+
if @command.column_scalar?
|
175
|
+
"Scalar"
|
176
|
+
elsif @command.column_vector?
|
177
|
+
"Vector"
|
178
|
+
elsif @command.column_index?
|
179
|
+
"Index"
|
180
|
+
else
|
181
|
+
"Scalar"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def value_type
|
186
|
+
@command.type
|
187
|
+
end
|
188
|
+
|
189
|
+
def vector_options
|
190
|
+
return nil unless @command.column_vector?
|
191
|
+
{
|
192
|
+
"weight" => @command.with_weight?,
|
193
|
+
}
|
194
|
+
end
|
195
|
+
|
196
|
+
def index_options
|
197
|
+
return nil unless @command.column_index?
|
198
|
+
{
|
199
|
+
"section" => @command.with_section?,
|
200
|
+
"weight" => @command.with_weight?,
|
201
|
+
"position" => @command.with_position?,
|
202
|
+
"sources" => @command.sources,
|
203
|
+
}
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
data/lib/grn2drn/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grn2drn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Droonga Project
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -113,6 +113,7 @@ email:
|
|
113
113
|
- droonga@groonga.org
|
114
114
|
executables:
|
115
115
|
- grn2drn
|
116
|
+
- grn2drn-schema
|
116
117
|
extensions: []
|
117
118
|
extra_rdoc_files: []
|
118
119
|
files:
|
@@ -120,9 +121,12 @@ files:
|
|
120
121
|
- Rakefile
|
121
122
|
- Gemfile
|
122
123
|
- grn2drn.gemspec
|
123
|
-
- lib/grn2drn/converter.rb
|
124
|
+
- lib/grn2drn/command-converter.rb
|
124
125
|
- lib/grn2drn/version.rb
|
126
|
+
- lib/grn2drn/error.rb
|
127
|
+
- lib/grn2drn/schema-converter.rb
|
125
128
|
- bin/grn2drn
|
129
|
+
- bin/grn2drn-schema
|
126
130
|
homepage: https://github.com/droonga/grn2drn
|
127
131
|
licenses:
|
128
132
|
- GPLv3 or later
|
@@ -143,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
147
|
version: '0'
|
144
148
|
requirements: []
|
145
149
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.0.
|
150
|
+
rubygems_version: 2.0.13
|
147
151
|
signing_key:
|
148
152
|
specification_version: 4
|
149
153
|
summary: Grn2drn is a command to convert a *.grn dump file to a JSONs file for Droonga.
|