# frozen_string_literal: true require 'roo' require 'google/cloud/bigquery' module Eost DF = '%Y-%m-%d' DI = '%Y-%m-%d %H:%M:%S' # folhas calculo comuns no bigquery class Bigquery # @return [Roo::Excelx] folha calculo a processar attr_reader :book # @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 # usa env GOOGLE_APPLICATION_CREDENTIALS para obter credentials # @see https://cloud.google.com/bigquery/docs/authentication/getting-started @api = Google::Cloud::Bigquery.new end # cria job bigquery & verifica execucao # # @param [String] sql para executar # @return [Boolean] job ok? def job_bigquery?(sql) @job = api.query_job(sql) @job.wait_until_done! puts @job.error['message'] if @job.failed? @job.failed? end # cria Data Manipulation Language (DML) job bigquery # # @param (see job_bigquery?) # @return [Integer] numero linhas afetadas def dml(sql) job_bigquery?(sql) ? 0 : job.num_dml_affected_rows end # cria sql job bigquery com resultados # # @return [Array] resultado sql def sql_select # se array.count > 1 => nao fazer nada @sql = job_bigquery?('select * ' + sql_where) ? [{}, {}] : job.data end # @return [String] parte sql para processamento linhas similares def sql_where "from coins.eos where blocknumber=#{row[0]}" end # @return [Integer] numero linhas inseridas def sql_insert dml('insert coins.eos(blocknumber,time,contract,' \ 'action,acfrom,acto,amount,symbol,memo,data,dias) VALUES(' + sql_insert1 + sql_insert2) end # @return [String] campos insert da linha bigquery def sql_insert1 "#{row[0]},'#{DateTime.parse(row[1]).strftime(DI)}','#{row[2]}'," end # @return [String] campos insert da linha bigquery def sql_insert2 "'#{row[3]}','#{row[4]}','#{row[5]}',#{row[6]}," \ "'#{row[7]}','#{row[8]}','#{row[9]}',0)" end # @return [Integer] numero linhas apagadas def sql_delete dml('delete ' + sql_where) end end end