Class: Eost::Bigquery

Inherits:
Object
  • Object
show all
Defined in:
lib/eost/bigquery.rb,
lib/eost/folhacalculo.rb

Overview

trabalhar com folhas calculo bloks.io & dados no bigquery

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(csv = '', ops = { e: false, m: false, i: false }) ⇒ Bigquery

Returns acesso folhas calculo bloks.io & correspondente bigquery dataset.

Parameters:

  • csv (String) (defaults to: '')

    folha calculo para processar

  • ops (Hash<Symbol, Boolean>) (defaults to: { e: false, m: false, i: false })

    opcoes trabalho com linhas

Options Hash (ops):

  • :e (Boolean) — default: false

    apaga linha igual?

  • :m (Boolean) — default: false

    apaga linhas existencia multipla?

  • :i (Boolean) — default: false

    insere linha nova?



33
34
35
36
37
38
39
40
# File 'lib/eost/bigquery.rb', line 33

def initialize(csv = '', ops = { e: false, m: false, i: false })
  @folha = Roo::CSV.new(csv) if csv.size.positive?
  @linha = ops

  # usa env GOOGLE_APPLICATION_CREDENTIALS para obter credentials
  # @see https://cloud.google.com/bigquery/docs/authentication/getting-started
  @api = Google::Cloud::Bigquery.new
end

Instance Attribute Details

#apiGoogle::Cloud::Bigquery (readonly)

Returns API bigquery.

Returns:

  • (Google::Cloud::Bigquery)

    API bigquery



19
20
21
# File 'lib/eost/bigquery.rb', line 19

def api
  @api
end

#folhaRoo::CSV (readonly)

Returns folha calculo a processar.

Returns:

  • (Roo::CSV)

    folha calculo a processar



14
15
16
# File 'lib/eost/bigquery.rb', line 14

def folha
  @folha
end

#jobGoogle::Cloud::Bigquery::QueryJob (readonly)

Returns job bigquery.

Returns:

  • (Google::Cloud::Bigquery::QueryJob)

    job bigquery



23
24
25
# File 'lib/eost/bigquery.rb', line 23

def job
  @job
end

#linhaHash<Symbol, Boolean> (readonly)

Returns opcoes trabalho com linhas.

Returns:

  • (Hash<Symbol, Boolean>)

    opcoes trabalho com linhas



16
17
18
# File 'lib/eost/bigquery.rb', line 16

def linha
  @linha
end

#rowArray (readonly)

Returns row folha calculo em processamento.

Returns:

  • (Array)

    row folha calculo em processamento



21
22
23
# File 'lib/eost/bigquery.rb', line 21

def row
  @row
end

#sqrGoogle::Cloud::Bigquery::Data (readonly)

Returns resultado do SQL.

Returns:

  • (Google::Cloud::Bigquery::Data)

    resultado do SQL



25
26
27
# File 'lib/eost/bigquery.rb', line 25

def sqr
  @sqr
end

Instance Method Details

#act(htx) ⇒ Hash

Returns dados da acao.

Parameters:

  • htx (Hash)

    transacao normal

Returns:

  • (Hash)

    dados da acao



128
129
130
# File 'lib/eost/bigquery.rb', line 128

def act(htx)
  htx['action_trace']['act']
end

#act_data(htx) ⇒ Hash

Returns dados da acao.

Parameters:

  • htx (Hash)

    transacao normal

Returns:

  • (Hash)

    dados da acao



134
135
136
# File 'lib/eost/bigquery.rb', line 134

def act_data(htx)
  act(htx)['data']
end

#carteirasCarteiras

Returns API eosscan - processar carteiras & transacoes.

Returns:

  • (Carteiras)

    API eosscan - processar carteiras & transacoes



54
55
56
# File 'lib/eost/bigquery.rb', line 54

def carteiras
  transacoes
end

#dml(cmd) ⇒ Integer

cria Data Manipulation Language (DML) job bigquery

Parameters:

  • cmd (String)

    comando SQL a executar

Returns:

  • (Integer)

    numero linhas afetadas



162
163
164
# File 'lib/eost/bigquery.rb', line 162

def dml(cmd)
  job?(cmd) ? 0 : job.num_dml_affected_rows
end

#eos_api_val1(htx) ⇒ String

Returns valores formatados para insert eos (parte1).

Parameters:

  • htx (Hash)

    transacao ligadas a uma carteira - sem elementos irrelevantes

Returns:

  • (String)

    valores formatados para insert eos (parte1)



106
107
108
109
110
111
112
113
114
# File 'lib/eost/bigquery.rb', line 106

def eos_api_val1(htx)
  "(#{Integer(htx['block_num'])}," \
  "DATETIME(TIMESTAMP('#{htx['block_time']}'))," \
  "'#{act(htx)['account']}'," \
  "'#{act(htx)['name']}'," \
  "'#{act_data(htx)['from']}'," \
  "'#{act_data(htx)['to']}'," \
  "#{eos_api_val2(htx)}"
end

#eos_api_val2(htx) ⇒ String

Returns valores formatados para insert eos (parte2).

Parameters:

  • htx (Hash)

    transacao ligadas a uma carteira - sem elementos irrelevantes

Returns:

  • (String)

    valores formatados para insert eos (parte2)



118
119
120
121
122
123
124
# File 'lib/eost/bigquery.rb', line 118

def eos_api_val2(htx)
  "#{act_data(htx)['quantity'].to_d}," \
  "'#{act_data(htx)['quantity'][/[[:upper:]]+/]}'," \
  "'#{act_data(htx)['memo']}'," \
  "'#{act_data(htx)}'," \
  "#{Integer(linha[:h][String(htx['block_num'])] || 0)})"
end

#eos_csv_val1String

Returns valores formatados para insert eos (parte1).

Returns:

  • (String)

    valores formatados para insert eos (parte1)



81
82
83
84
85
86
# File 'lib/eost/bigquery.rb', line 81

def eos_csv_val1
  "#{row[0]}," \
  "'#{Time.parse(row[1]).strftime(DI)}'," \
  "'#{row[2]}'," \
  "#{eos_csv_val2}"
end

#eos_csv_val2String

Returns valores formatados para insert eos (parte2).

Returns:

  • (String)

    valores formatados para insert eos (parte2)



89
90
91
92
93
94
95
96
97
# File 'lib/eost/bigquery.rb', line 89

def eos_csv_val2
  "'#{row[3]}'," \
  "'#{row[4]}'," \
  "'#{row[5]}'," \
  "#{Float(row[6])}," \
  "'#{row[7]}'," \
  "'#{row[8]}'," \
  "'#{row[9]}',0"
end

#eos_fieldsString

Returns campos da tabela eos no bigquery.

Returns:

  • (String)

    campos da tabela eos no bigquery



64
65
66
# File 'lib/eost/bigquery.rb', line 64

def eos_fields
  'blocknumber,time,contract,action,acfrom,acto,amount,symbol,memo,data,dias'
end

#eos_insert_apiInteger

Returns numero linhas inseridas.

Returns:

  • (Integer)

    numero linhas inseridas



100
101
102
# File 'lib/eost/bigquery.rb', line 100

def eos_insert_api
  dml("INSERT #{BD}.eos(#{eos_fields}) VALUES#{transacoes.novas.map { |e| eos_api_val1(e) }.join(',')}")
end

#eos_insert_csvInteger

Returns numero linhas inseridas.

Returns:

  • (Integer)

    numero linhas inseridas



74
75
76
77
78
# File 'lib/eost/bigquery.rb', line 74

def eos_insert_csv
  return 1 unless linha[:i]

  dml("INSERT #{BD}.eos(#{eos_fields}) VALUES(#{eos_csv_val1})")
end

#job?(cmd) ⇒ Boolean

cria job bigquery & verifica execucao

Parameters:

  • cmd (String)

    comando SQL a executar

Returns:

  • (Boolean)

    job ok?



142
143
144
145
146
147
# File 'lib/eost/bigquery.rb', line 142

def job?(cmd)
  @job = api.query_job(cmd)
  @job.wait_until_done!
  puts(@job.error['message']) if @job.failed?
  @job.failed?
end

#processaObject

insere transacoes novas na tabela eos



59
60
61
# File 'lib/eost/bigquery.rb', line 59

def processa
  puts(format("%<n>2i LINHAS INSERIDAS #{BD}.eos", n: transacoes.novas.count.positive? ? eos_insert_api : 0))
end

#processa_csvObject

processa folha calculo



11
12
13
14
15
16
17
# File 'lib/eost/folhacalculo.rb', line 11

def processa_csv
  n = 0
  folha.sheet(0).parse(header_search: HT) do |r|
    n += 1
    puts n == 1 ? "\n#{folha.info}" : processa_row(r)
  end
end

#processa_row(has) ⇒ String

processa linha folha calculo para arquivo

Parameters:

  • has (Hash)

    da linha em processamento

Returns:

  • (String)

    texto informativo do processamento



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/eost/folhacalculo.rb', line 23

def processa_row(has)
  @row = has.values

  # array.count  = 0 ==> pode carregar esta linha
  # array.count >= 1 ==> nao carregar esta linha
  sql("select #{eos_fields} #{sql_where}", [{}, {}])

  if row_naoexiste? then row_str + (eos_insert_csv == 1 ? ' NOVA' : ' ERRO')
  elsif row_existe? then row_existente
  else                   row_multiplas
  end
end

#row_existe?Boolean

Returns linha folha calculo existe no bigquery?.

Returns:

  • (Boolean)

    linha folha calculo existe no bigquery?



75
76
77
# File 'lib/eost/folhacalculo.rb', line 75

def row_existe?
  sqr.count == 1
end

#row_existenteString

Returns linha folha calculo existente.

Returns:

  • (String)

    linha folha calculo existente



52
53
54
55
# File 'lib/eost/folhacalculo.rb', line 52

def row_existente
  d = linha[:e] ? dml("delete #{sql_where}") : 0
  "#{row_str} EXISTENTE#{str_apagadas(d)}"
end

#row_multiplasString

Returns linha folha calculo existencia multipla.

Returns:

  • (String)

    linha folha calculo existencia multipla



58
59
60
61
# File 'lib/eost/folhacalculo.rb', line 58

def row_multiplas
  d = linha[:m] ? dml("delete #{sql_where}") : 0
  "#{row_str} MULTIPLAS #{sql.count}#{str_apagadas(d)}"
end

#row_naoexiste?Boolean

Returns linha folha calculo nao existe no bigquery?.

Returns:

  • (Boolean)

    linha folha calculo nao existe no bigquery?



70
71
72
# File 'lib/eost/folhacalculo.rb', line 70

def row_naoexiste?
  sqr.count.zero?
end

#row_r1String

Returns linha folha calculo formatada.

Returns:

  • (String)

    linha folha calculo formatada



42
43
44
# File 'lib/eost/folhacalculo.rb', line 42

def row_r1
  format(R1, v5: row[4], v6: row[5])
end

#row_r2String

Returns linha folha calculo formatada.

Returns:

  • (String)

    linha folha calculo formatada



47
48
49
# File 'lib/eost/folhacalculo.rb', line 47

def row_r2
  format(R2, v7: Float(row[6]), v8: row[7])
end

#row_strString

Returns linha folha calculo formatada.

Returns:

  • (String)

    linha folha calculo formatada



37
38
39
# File 'lib/eost/folhacalculo.rb', line 37

def row_str
  "#{row[0]} #{Time.parse(row[1]).strftime(DF)} " + row_r1 + row_r2
end

#sql(cmd, red = []) ⇒ Google::Cloud::Bigquery::Data

cria Structured Query Language (SQL) job bigquery

Parameters:

  • cmd (String)

    comando SQL a executar

  • red (Array<Hash>) (defaults to: [])

    resultado quando SQL tem erro

Returns:

  • (Google::Cloud::Bigquery::Data)

    resultado do SQL



154
155
156
# File 'lib/eost/bigquery.rb', line 154

def sql(cmd, red = [])
  @sqr = job?(cmd) ? red : job.data
end

#sql_whereString

Returns parte sql para processamento linhas existentes.

Returns:

  • (String)

    parte sql para processamento linhas existentes



69
70
71
# File 'lib/eost/bigquery.rb', line 69

def sql_where
  "from #{BD}.eos where blocknumber=#{row[0]}"
end

#str_apagadas(num) ⇒ String

Returns texto formatado linhas apagadas.

Parameters:

  • num (Integer)

    numero linhas apagadas

Returns:

  • (String)

    texto formatado linhas apagadas



65
66
67
# File 'lib/eost/folhacalculo.rb', line 65

def str_apagadas(num)
  num.positive? ? " & #{num} APAGADA(S) " : ' '
end

#transacoesCarteiras

Returns API eosscan - processar transacoes.

Returns:

  • (Carteiras)

    API eosscan - processar transacoes



43
44
45
46
47
48
49
50
51
# File 'lib/eost/bigquery.rb', line 43

def transacoes
  @transacoes ||= Carteiras.new(
    {
      wb: sql("select * from #{BD}.walletEos order by 1").map { |e| { ax: e[:weos], sl: e[:eos].to_d } },
      nt: sql("select blocknumber,iax from #{BD}.eostx order by 1")
    },
    linha
  )
end