omf_oml 1.1.6 → 1.1.7
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/lib/omf_oml/csv_table.rb +31 -5
- data/lib/omf_oml/sql_row.rb +1 -0
- data/lib/omf_oml/table.rb +5 -1
- data/lib/omf_oml/version.rb +1 -1
- metadata +2 -2
data/lib/omf_oml/csv_table.rb
CHANGED
@@ -20,7 +20,8 @@ module OMF::OML
|
|
20
20
|
# @param opts
|
21
21
|
#
|
22
22
|
def self.create(tname, file_name, opts = {}, &on_before_row_added)
|
23
|
-
|
23
|
+
opts[:file_name] = file_name
|
24
|
+
self.new(tname, opts[:schema], opts, &on_before_row_added)
|
24
25
|
end
|
25
26
|
|
26
27
|
#
|
@@ -28,27 +29,29 @@ module OMF::OML
|
|
28
29
|
# schema - OmlSchema or Array containing [name, type*] for every column in table
|
29
30
|
# Table adds a '__id__' column at the beginning which keeps track of the rows unique id
|
30
31
|
# @params opts
|
32
|
+
# @opts :file_name - Name of file to read data from
|
31
33
|
# @opts :max_size - keep table to that size by dropping older rows
|
32
34
|
# @opts :index - only keep the latest inserted row for a unique col value - messes with row order
|
33
35
|
# @opts :has_csv_header If true use first row in file as schema descriptor
|
34
36
|
# @opts :schema Schema associated with this table
|
35
37
|
#
|
36
|
-
def initialize(tname,
|
38
|
+
def initialize(tname, schema, opts = {}, &on_before_row_added)
|
39
|
+
file_name = opts[:file_name]
|
37
40
|
unless File.readable?(file_name)
|
38
41
|
raise "Can't read CSV file '#{file_name}'"
|
39
42
|
end
|
40
43
|
csv_opts = {}
|
41
|
-
csv_opts[:headers] = (opts.delete(:has_csv_header) == true)
|
44
|
+
csv_opts[:headers] = (opts[:has_csv_header] == true) #(opts.delete(:has_csv_header) == true)
|
42
45
|
unless csv_opts[:headers]
|
43
46
|
raise "Current implementation only works with CSV files which inlcude a schema description in the first line"
|
44
47
|
end
|
45
48
|
|
46
|
-
encoding = opts.delete(:encoding)
|
49
|
+
encoding = opts[:encoding] #opts.delete(:encoding)
|
47
50
|
mode = "rb"
|
48
51
|
mode << ":#{encoding}" if encoding
|
49
52
|
csv = CSV.open(file_name, mode, csv_opts)
|
50
53
|
|
51
|
-
unless schema = opts
|
54
|
+
unless schema = opts[:schema]
|
52
55
|
unless csv_opts[:headers]
|
53
56
|
raise "No schema given and ':has_csv_header' not set to capture schema from file header"
|
54
57
|
end
|
@@ -79,6 +82,29 @@ module OMF::OML
|
|
79
82
|
|
80
83
|
end
|
81
84
|
|
85
|
+
# Return a new table which only contains the rows of this
|
86
|
+
# table whose value in column 'col_name' is equal to 'col_value'
|
87
|
+
#
|
88
|
+
def create_sliced_table(col_name, col_value, table_opts = {})
|
89
|
+
sname = "#{@name}_slice_#{Kernel.rand(100000)}"
|
90
|
+
st = OmlTable.new(sname, @schema, table_opts)
|
91
|
+
index = @schema.index_for_col(col_name)
|
92
|
+
first_row = true
|
93
|
+
@rows.each do |row|
|
94
|
+
if row[index] == col_value
|
95
|
+
#row = row[1 .. -1] # remove the row_id
|
96
|
+
debug "Add first row '#{row.inspect}'" if first_row
|
97
|
+
st.add_row(row)
|
98
|
+
first_row = false
|
99
|
+
end
|
100
|
+
end
|
101
|
+
def st.release
|
102
|
+
# do nothing
|
103
|
+
end
|
104
|
+
|
105
|
+
debug "Created sliced table '#{sname}' from '#{@name}' (rows: #{st.rows.length} from #{@rows.length})"
|
106
|
+
st
|
107
|
+
end
|
82
108
|
|
83
109
|
|
84
110
|
end # class
|
data/lib/omf_oml/sql_row.rb
CHANGED
@@ -31,6 +31,7 @@ module OMF::OML
|
|
31
31
|
# - query_interval: Interval between consecutive queries when processing large result set.
|
32
32
|
#
|
33
33
|
def initialize(sql_table_name, schema, query, opts = {})
|
34
|
+
debug "query: #{query.sql}"
|
34
35
|
@sname = sql_table_name
|
35
36
|
@schema = schema
|
36
37
|
raise "Expected OmlSchema but got '#{schema.class}'" unless schema.is_a? OmlSchema
|
data/lib/omf_oml/table.rb
CHANGED
@@ -58,6 +58,7 @@ module OMF::OML
|
|
58
58
|
@schema.insert_column_at(0, [:__id__, 'int'])
|
59
59
|
end
|
60
60
|
end
|
61
|
+
@col_count = @schema.columns.length
|
61
62
|
@opts = opts
|
62
63
|
if (index = opts[:index])
|
63
64
|
throw "No longer supported, use IndexedTable instead"
|
@@ -163,7 +164,7 @@ module OMF::OML
|
|
163
164
|
def create_sliced_table(col_name, col_value, table_opts = {})
|
164
165
|
sname = "#{@name}_slice_#{Kernel.rand}"
|
165
166
|
|
166
|
-
st = self.class.new(name, @schema, table_opts)
|
167
|
+
st = self.class.new(name, @schema, @opts.merge(table_opts))
|
167
168
|
st.instance_variable_set(:@sname, sname)
|
168
169
|
st.instance_variable_set(:@master_ds, self)
|
169
170
|
st.instance_variable_set(:@add_index, true)
|
@@ -230,6 +231,9 @@ module OMF::OML
|
|
230
231
|
# was ultimately added.
|
231
232
|
#
|
232
233
|
def _add_row_finally(row)
|
234
|
+
unless row.length == @col_count
|
235
|
+
raise "Unexpected col count for row '#{row}' - schema: #{@schema}"
|
236
|
+
end
|
233
237
|
# if @indexed_rows
|
234
238
|
# @indexed_rows[row[@index_col]] = row
|
235
239
|
# return
|
data/lib/omf_oml/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_oml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.7
|
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-07-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: omf_base
|