lib/abank/big.rb in abank-0.2.4 vs lib/abank/big.rb in abank-0.2.5

- old
+ new

@@ -1,138 +1,134 @@ # frozen_string_literal: true require 'google/cloud/bigquery' -# class Contrato +# @see Abank::Big class Abank::Big DF = '%Y-%m-%d' + # @return [Hash] opcoes trabalho + attr_reader :opcao + # @return [Google::Cloud::Bigquery] API bigquery - attr_reader :api - # @return [Hash] opcoes trabalho com linhas - attr_reader :opl + attr_reader :bqapi # @return [Google::Cloud::Bigquery::QueryJob] job bigquery - attr_reader :job - # @return [Google::Cloud::Bigquery::Data] lista devolvida pelo select - attr_reader :resultados + attr_reader :bqjob - # @param [Hash] ops opcoes trabalho - # @option ops [Boolean] :s (false) apaga linha similar? (mv) - # @option ops [Boolean] :e (false) apaga linha igual? (mv) - # @option ops [Boolean] :m (false) apaga linhas existencia multipla? (mv) - # @option ops [Boolean] :i (false) insere linha nova? (mv) - # @option ops [String] :v ('') data valor (mv)/data contrato (re) - # @option ops [String] :g ('') classificacao movimentos (mv) - # @option ops [Boolean] :t (false) trabalha todoas as rendas? (re) - # @option ops [String] :k ('') keys movimentos a apagar (mv) - # @return [Big] acesso bigquery dataset - def initialize(ops = {}) - @opl = ops - @api ||= Google::Cloud::Bigquery.new - p ['Big', ops, api] - end + # @return [Google::Cloud::Bigquery::Data] resultado do select + attr_reader :bqres - # (see CLI#classifica) - def mv_classifica - return unless opl[:i] + # @return [Integer] numero linhas afetadas pela Data Manipulation Language (DML) + attr_reader :bqnrs - i = 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') - puts 'LINHAS CLASSIFICADAS ' + i.to_s - return unless i.positive? + # @return [String] movimentos a inserir (values.mv) + attr_reader :mvvls - re_atualiza - end + # @return [String] movimentos a apagar (keysin.mv) + attr_reader :mvkys - # (see CLI#atualiza) - def re_atualiza - r = re_join(lista_ativos) - if r.size.zero? - puts 'NAO EXISTEM RENDAS NOVAS' - else - puts 'RENDAS CRIADAS ' + dml('insert hernanilr.ab.re VALUES' + r).to_s - end + # acesso a base dados abank no bigquery + # + # @param [Hash] opc opcoes trabalho + # @option opc [String] :k ('') movimentos a apagar (keysin.mv) + # @option opc [String] :c ('') id contrato arrendamento (re) + # @option opc [String] :d ('') data inicio contrato arrendamento (re) + # @option opc [Boolean] :t (false) trabalha todas as rendas? (re) + # @return [Hash] opcoes trabalho + def initialize(opc = {}) + @opcao = opc + @bqapi = Google::Cloud::Bigquery.new + @mvvls = '' + @mvkys = opc.fetch(:k, '') + @ctide = opc.fetch(:c, '') + # p ['B', opcao] + opcao end - # (see CLI#apagamv) - def mv_apaga - e = ct_envolvidos - i = dml(sql_apaga_mv) - puts 'MOVIMENTOS APAGADOS ' + i.to_s - return unless i.positive? && e.count.positive? - - e.map { |c| Contrato.new(c).re_apaga } - - re_atualiza + # (see CLI#tag) + def mv_classifica + dml('update hernanilr.ab.mv set mv.ct=tt.nct ' \ + 'from (select * from hernanilr.ab.cl) as tt ' \ + "where #{ky_mv}=tt.ky") + puts 'MOVIMENTOS CLASSIFICADOS ' + bqnrs.to_s end - def ct_envolvidos - sel(sql_sel_mv).group_by { |r| r[:ct] } - .delete_if { |k, _| !k || k[0] != 'r' }.keys - end + # apaga movimentos & suas rendas associadas no bigquery + # + # @return [Big] acesso a base dados abank no bigquery + def mv_delete + vars_mv_work + if mvkys.size.positive? + # obtem lista contratos arrendamento associados aos movimentos a apagar + @ctlct = sel("select ct from hernanilr.ab.mv where #{ky_mv} in(#{mvkys}) and substr(ct,1,1)='r' group by 1") - # @return [Array<Hash>] lista contratos com lista movimentos novos - def lista_ativos - sel(sql_ativos_re).map { |c| Contrato.new(c[:ct]).dados_contrato }.compact - end + # apaga rendas associadas e depois movimentos + @opcao[:t] = true + lr_apaga.mv_delete_dml - # @param [Array<Hash>] lct lista contratos com lista movimentos novos - # @return [String] row formatada das novas rendas para inserir bigquery - def re_join(lct) - lct.map { |c| Contrato::Rendas.new(c).rendas }.flatten(1).join(',') + # para obrigar re_work a trabalhar com lista contratos (ctlct) + @bqnrs = 0 + end + self end - def sql_ativos_re - 'SELECT ct from hernanilr.ab.re group by 1 order by 1' + # insere & classifica movimentos no bigquery + # + # @return [Big] acesso a base dados abank no bigquery + def mv_insert + if mvvls.size.positive? + dml('insert hernanilr.ab.mv VALUES' + mvvls) + puts 'MOVIMENTOS INSERIDOS ' + bqnrs.to_s + mv_classifica if bqnrs.positive? + end + self end - def sql_sel_mv - 'select * ' + sql_where_mv + # inicializa variaveis para delete/insert movimentos + def vars_mv_work + @bqnrs = 0 + @ctlct = [] + @mvkys = mvkys[1..] if mvkys[0] == ',' + @mvvls = mvvls[1..] if mvvls[0] == ',' end - # @return [String] sql apaga movimentos - def sql_apaga_mv - 'delete ' + sql_where_mv + # apaga movimentos no bigquery + def mv_delete_dml + dml("delete from hernanilr.ab.mv where #{ky_mv} in(#{mvkys})") + puts 'MOVIMENTOS APAGADOS ' + bqnrs.to_s end - # @return [String] parte sql para processamento movimentos - def sql_where_mv - "from hernanilr.ab.mv where #{sql_digest_mv} in(#{opl[:k]})" + # @return [String] expressao sql da chave de movimentos + def ky_mv + 'FARM_FINGERPRINT(CONCAT(CAST(mv.nc as STRING),mv.ds,CAST(mv.dl as STRING),CAST(mv.vl as STRING)))' end - def sql_digest_mv - 'FARM_FINGERPRINT(CONCAT(CAST(nc as STRING),' \ - 'ds,CAST(dl as STRING),CAST(vl as STRING)))' - end - # cria job bigquery & verifica execucao # - # @param [String] sql comando sql a executar + # @param [String] sql comando a executar # @return [Boolean] job ok? - def job_bigquery?(sql) - p sql - @job = api.query_job(sql) - @job.wait_until_done! - puts @job.error['message'] if @job.failed? - @job.failed? + def job?(sql) + # p sql + @bqjob = bqapi.query_job(sql) + @bqjob.wait_until_done! + puts @bqjob.error['message'] if @bqjob.failed? + @bqjob.failed? end - # executa Data Manipulation Language (DML) job no bigquery + # executa sql & devolve resultado do bigquery # - # @param (see job_bigquery?) - # @return [Integer] numero linhas afetadas - def dml(sql) - job_bigquery?(sql) ? 0 : job.num_dml_affected_rows + # @param (see job?) + # @param [Array] erro quando da erro no bigquery + # @return [Google::Cloud::Bigquery::Data] resultado do sql + def sel(sql, erro = []) + @bqres = job?(sql) ? erro : bqjob.data end - # executa sql & devolve resultados do bigquery + # executa Data Manipulation Language (DML) no bigquery # - # @param sql (see job_bigquery?) - # @param [Array] arr resultado quando da erro no bigquery - # @return [Google::Cloud::Bigquery::Data] resultado do sql num array<hash> - def sel(sql, arr = []) - @resultados = job_bigquery?(sql) ? arr : job.data + # @param (see job?) + # @return [Integer] numero rows afetadas pelo dml + def dml(sql) + @bqnrs = job?(sql) ? 0 : bqjob.num_dml_affected_rows end end