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