lib/abank/bigquery.rb in abank-0.1.8 vs lib/abank/bigquery.rb in abank-0.1.9

- old
+ new

@@ -4,49 +4,51 @@ require 'google/cloud/bigquery' module Abank DF = '%Y-%m-%d' - # folhas calculo comuns no bigquery + # (see Bigquery) class Bigquery + # @return [Google::Cloud::Bigquery] API bigquery + attr_reader :apibq # @return [Roo::Excelx] folha calculo a processar - attr_reader :book + attr_reader :folha + # @return [Hash<Symbol, Boolean>] opcoes trabalho com linhas + attr_reader :linha + # @return [Integer] numero conta + attr_reader :conta + # @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 [Integer] numero conta - attr_reader :num - # @return [Hash<String, Boolean>] opcoes apagar linhas - attr_reader :apaga - # permite processa folhas calculo comuns no bigquery - # # @param [String] xls folha calculo para processar - # @param [Hash<String, Boolean>] apaga opcoes apagar linhas - # @option apaga [Boolean] s apaga linhas similares sim/nao? - # @option apaga [Boolean] e apaga linhas existentes sim/nao? - # @return [Bigquery] acesso folha calculo & bigquery - def initialize(xls = '', apaga = {}) - @book = Roo::Spreadsheet.open(xls) if xls.size.positive? - @num = xls.match?(/card/i) ? 2 : 1 - @apaga = apaga + # @param [Hash<Symbol, Boolean>] ops opcoes trabalho com linhas + # @option ops [Boolean] :s (false) apaga linha similar? + # @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 activobank + # & correspondente bigquery dataset + def initialize(xls = '', ops = { s: false, 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::Spreadsheet.open(xls) if xls.size.positive? + @linha = ops + @conta = xls.match?(/card/i) ? 2 : 1 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 @@ -56,42 +58,53 @@ # @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 ==> mais testes necessarios + # array.count > 1 ==> nao carregar esta linha @sql = job_bigquery?('select * ' + sql_where) ? [{}, {}] : job.data end # @return [String] parte sql para processamento linhas similares def sql_where - "from ab.mv where nc=#{num}" \ + "from hernanilr.ab.mv where nc=#{conta}" \ " and dl='#{row[0].strftime(DF)}'" \ " and vl=#{row[3]}" end - # classifica linhas - def sql_update + # (see CLI#classifica) + def classifica + return unless linha[:i] + puts 'LINHAS CLASSIFICADAS ' + - dml('update ab.mv set mv.ct=tt.nct' \ - ' from (select * from ab.cl) as tt ' \ - 'where mv.dl=tt.dl and mv.dv=tt.dv' \ - ' and mv.ds=tt.ds and mv.vl=tt.vl').to_s + dml('update hernanilr.ab.mv set mv.ct=tt.nct' \ + ' from (select * from hernanilr.ab.cl) as tt' \ + ' where mv.dl=tt.dl and mv.dv=tt.dv' \ + ' and mv.ds=tt.ds and mv.vl=tt.vl').to_s end # @return [Integer] numero linhas inseridas def sql_insert - dml('insert ab.mv(dl,dv,ds,vl,nc,ano,mes,ct,tp) VALUES(' \ - "'#{row[0].strftime(DF)}','#{row[1].strftime(DF)}','#{row[2]}'," \ - "#{row[3]},#{num}" + sql_insert_calculado) + return 1 unless linha[:i] + + dml('insert hernanilr.ab.mv(dl,dv,ds,vl,nc,ano,mes,ct,tp) VALUES(' \ + "'#{row[0].strftime(DF)}','#{row[1].strftime(DF)}','#{row[2]}'" + + str_insert1) end + # @return [String] campos extra da linha bigquery + def str_insert1 + ",#{row[3]},#{conta}" + str_insert2 + end + # @return [String] campos calculados da linha bigquery - def sql_insert_calculado + def str_insert2 ",#{row[1].year},#{row[1].month},null,'#{row[3].positive? ? 'c' : 'd'}')" end # @return [Integer] numero linhas apagadas def sql_delete