lib/eost/bigquery.rb in eost-0.1.5 vs lib/eost/bigquery.rb in eost-0.1.6

- old
+ new

@@ -5,44 +5,47 @@ module Eost DF = '%Y-%m-%d' DI = '%Y-%m-%d %H:%M:%S' - # folhas calculo comuns no bigquery + # (see Bigquery) class Bigquery - # @return [Roo::Excelx] folha calculo a processar - attr_reader :book + # @return [Google::Cloud::Bigquery] API bigquery + attr_reader :apibq + # @return [Roo::CSV] folha calculo a processar + attr_reader :folha + # @return [Hash<Symbol, Boolean>] opcoes trabalho com linhas + attr_reader :linha + # @return [Array] row folha calculo em processamento attr_reader :row - # @return [Google::Cloud::Bigquery] API bigquery - attr_reader :api # @return [Google::Cloud::Bigquery::QueryJob] job bigquery attr_reader :job # @return (see sql_select) attr_reader :sql - # @return [Boolean] apaga linhas existentes sim/nao? - attr_reader :apaga - # permite processa folhas calculo comuns no bigquery - # # @param [String] csv folha calculo para processar - # @param [Boolean] apaga linhas existentes sim/nao? - # @return [Bigquery] acesso folha calculo & bigquery - def initialize(csv = '', apaga = false) - @book = Roo::CSV.new(csv) if csv.size.positive? - @apaga = apaga + # @param [Hash<Symbol, Boolean>] ops opcoes trabalho com linhas + # @option ops [Boolean] :e (false) apaga linha igual? + # @option ops [Boolean] :m (false) apaga linhas existencia multipla? + # @option ops [Boolean] :i (false) insere linha nova? + # @return [Bigquery] acesso folhas calculo bloks.io + # & correspondente bigquery dataset + def initialize(csv = '', ops = { e: false, m: false, i: false }) # usa env GOOGLE_APPLICATION_CREDENTIALS para obter credentials # @see https://cloud.google.com/bigquery/docs/authentication/getting-started - @api = Google::Cloud::Bigquery.new + @apibq = Google::Cloud::Bigquery.new + @folha = Roo::CSV.new(csv) if csv.size.positive? + @linha = ops end # cria job bigquery & verifica execucao # - # @param [String] sql para executar + # @param [String] sql a executar # @return [Boolean] job ok? def job_bigquery?(sql) - @job = api.query_job(sql) + @job = apibq.query_job(sql) @job.wait_until_done! puts @job.error['message'] if @job.failed? @job.failed? end @@ -52,37 +55,41 @@ # @return [Integer] numero linhas afetadas def dml(sql) job_bigquery?(sql) ? 0 : job.num_dml_affected_rows end - # cria sql job bigquery com resultados + # pesquisa existencia linha folha calculo no bigquery # - # @return [Array<Hash>] resultado sql + # @return [Google::Cloud::Bigquery::Data] resultado do sql num array<hash> def sql_select - # se array.count > 1 => nao fazer nada + # array.count = 0 ==> pode carregar esta linha + # array.count >= 1 ==> nao carregar esta linha @sql = job_bigquery?('select * ' + sql_where) ? [{}, {}] : job.data end - # @return [String] parte sql para processamento linhas similares + # @return [String] parte sql para processamento linhas existentes def sql_where - "from coins.eos where blocknumber=#{row[0]}" + "from hernanirvaz.coins.eos where blocknumber=#{row[0]}" end # @return [Integer] numero linhas inseridas def sql_insert - dml('insert coins.eos(blocknumber,time,contract,' \ + return 1 unless linha[:i] + + dml('insert hernanirvaz.coins.eos(blocknumber,time,contract,' \ 'action,acfrom,acto,amount,symbol,memo,data,dias) VALUES(' + - sql_insert1 + sql_insert2) + str_insert1) end # @return [String] campos insert da linha bigquery - def sql_insert1 - "#{row[0]},'#{DateTime.parse(row[1]).strftime(DI)}','#{row[2]}'," + def str_insert1 + "#{row[0]},'#{DateTime.parse(row[1]).strftime(DI)}','#{row[2]}'," + + str_insert2 end # @return [String] campos insert da linha bigquery - def sql_insert2 - "'#{row[3]}','#{row[4]}','#{row[5]}',#{row[6]}," \ + def str_insert2 + "'#{row[3]}','#{row[4]}','#{row[5]}',#{row[6].to_f}," \ "'#{row[7]}','#{row[8]}','#{row[9]}',0)" end # @return [Integer] numero linhas apagadas def sql_delete