Class: Limeta::Table
- Inherits:
-
Object
- Object
- Limeta::Table
- Defined in:
- lib/limeta/table.rb
Constant Summary collapse
- FIELDS =
{ Event: {type: :string}, Site: {type: :string, size: 50}, White: {type: :string, size: 30}, Black: {type: :string, size: 30}, Result: {type: :string, size: 10}, UTCDate: {type: :date, size: 15}, UTCTime: {type: :time, size: 8}, WhiteElo: {type: :integer}, BlackElo: {type: :integer}, WhiteRatingDiff: {type: :integer}, BlackRatingDiff: {type: :integer}, WhiteTitle: {type: :string, size: 5}, BlackTitle: {type: :string, size: 5}, ECO: {type: :string, size: 3}, Opening: {type: :string}, TimeControl: {type: :string, size: 15}, Termination: {type: :string, size: 20}, Variant: {type: :string} }
Instance Method Summary collapse
- #create(force: false) ⇒ Object
- #exist? ⇒ Boolean
-
#initialize(name, database:) ⇒ Table
constructor
A new instance of Table.
- #populate!(files) ⇒ Object
- #prepare ⇒ Object
Constructor Details
#initialize(name, database:) ⇒ Table
Returns a new instance of Table.
32 33 34 35 36 |
# File 'lib/limeta/table.rb', line 32 def initialize(name, database:) @name = name @database = database prepare end |
Instance Method Details
#create(force: false) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/limeta/table.rb', line 114 def create(force: false) @database.send((force ? :create_table! : :create_table), @name) do primary_key :id FIELDS.each do |name, | case [:type] when :string then String name, size: ([:size] || 255) when :integer then Integer name when :date then Date name when :time then Time name, only_time: true end end end end |
#exist? ⇒ Boolean
110 111 112 |
# File 'lib/limeta/table.rb', line 110 def exist? @database.table_exists? @name end |
#populate!(files) ⇒ Object
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 |
# File 'lib/limeta/table.rb', line 38 def populate!(files) progress = TTY::ProgressBar::Multi.new("\e[1mAll files\e[0m: [:bar] :percent", incomplete: "\e[90m=\e[0m", complete: "\e[32;1m=\e[0m") = {} files.each do |file| [file] = progress.register("#{file} [:bar] :percent (of :total bytes)", total: File.size(file), complete: "\e[32;2m=\e[0m") end puts progress.start bm = Benchmark.measure do files.each do |file| record = {} prev = '' File.open(file, 'r').each do |line| if prev =~ /\A\[.*\Z/ && line =~ /\A[\n\r].*\Z/ @database[@name.to_sym].insert(**record) record = {} prev = line [file].advance(line.bytesize) # Increment next end if line =~ /\A([\n\r]|[0-9]).*\Z/ prev = line [file].advance(line.bytesize) # Increment next end subbed = line.gsub(%r{[\r\n\[\]\"]},'') field, value = subbed.split(' ', 2) field = field.to_sym if FIELDS[field] record[field] = case FIELDS[field][:type] when :string then value when :integer then value.to_i when :date then Date.parse(value) when :time then value end end prev = line [file].advance(line.bytesize) # Increment end end end bm_out = String.build("Finished in ") do |s| s << "#{bm.utime.round(4)}s (cpu), " s << "#{bm.stime.round(4)}s (system), " s << "#{bm.total.round(4)}s (total), " s << "#{bm.real.round(4)}s (real)" end puts puts bm_out @database.disconnect end |
#prepare ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/limeta/table.rb', line 97 def prepare prompt = TTY::Prompt.new if exist? if prompt.yes? "Overwrite table '\e[1m#{@name}\e[0m'?" if prompt.yes? "Are you sure? This action cannot be reverted." create force: true end end else create end end |