function new_order()

in perfkitbenchmarker/data/sysbench/spanner_pg_tpcc_run.lua [239:403]


function new_order()



    local table_num = sysbench.rand.uniform(1, sysbench.opt.tables)
    local w_id = sysbench.rand.uniform(1, sysbench.opt.scale)
    local d_id = sysbench.rand.uniform(1, DIST_PER_WARE)
    local c_id = NURand(1023, 1, CUST_PER_DIST)

    local ol_cnt = sysbench.rand.uniform(5, 15);
    local rbk = sysbench.rand.uniform(1, 100);
    local itemid = {}
    local supware = {}
    local qty = {}
    local all_local = 1

    for i = 1, ol_cnt
    do
        itemid[i] = NURand(8191, 1, MAXITEMS)
        if ((i == ol_cnt - 1) and (rbk == 1))
        then
            itemid[i] = -1
        end
        if sysbench.rand.uniform(1, 100) ~= 1
        then
            supware[i] = w_id
        else
            supware[i] = other_ware(w_id)
            all_local = 0
        end
        qty[i] = sysbench.rand.uniform(1, 10)
    end










  con:query("BEGIN")

  local c_discount
  local c_last
  local c_credit
  local w_tax

  c_discount, c_last, c_credit, w_tax = con:query_row(([[EXECUTE select_customer_info%d (%d,%d,%d);]]):
                                                         format(table_num, w_id, d_id, c_id))





  local d_next_o_id
  local d_tax

  
  d_next_o_id, d_tax = con:query_row(([[EXECUTE get_next_order_id_and_tax%d (%d,%d);]]):
                                        format(table_num, w_id, d_id))




  con:query(([[EXECUTE update_next_order_id%d (%d,%d,%d);]]):format(table_num, d_next_o_id + 1, d_id, w_id))






  con:query(([[EXECUTE insert_order%d (%d,%d,%d,%d,%d,%d);]]):
                    format(table_num, d_next_o_id, d_id, w_id, c_id, ol_cnt, all_local))



  con:query(([[EXECUTE insert_new_order%d (%d,%d,%d);]]):
                   format(table_num, d_next_o_id, d_id, w_id))

  for ol_number=1, ol_cnt do
    local ol_supply_w_id = supware[ol_number]
    local ol_i_id = itemid[ol_number]
    local ol_quantity = qty[ol_number]






    rs = con:query(([[EXECUTE select_item%d (%d)]]):
                      format(table_num, ol_i_id))

    local i_price
    local i_name
    local i_data

    if rs.nrows == 0 then

      ffi.C.sb_counter_inc(sysbench.tid, ffi.C.SB_CNT_ERROR)
      con:query("ROLLBACK")
      return
    end

    i_price, i_name, i_data = unpack(rs:fetch_row(), 1, rs.nfields)












    local s_quantity
    local s_data
    local ol_dist_info
    local ol_di = {}

    s_quantity, s_data, ol_di[1], ol_di[2], ol_di[3], ol_di[4], ol_di[5], ol_di[6], ol_di[7], ol_di[8], ol_di[9], ol_di[10] = con:query_row((
      [[EXECUTE select_stock%d (%d,%d)]]):
      format(table_num,ol_i_id,ol_supply_w_id ))
    ol_dist_info = ol_di[d_id]

    s_quantity=tonumber(s_quantity)
    if (s_quantity > ol_quantity) then
      s_quantity = s_quantity - ol_quantity
    else
      s_quantity = s_quantity - ol_quantity + 91
    end





    con:query(([[EXECUTE update_stock%d (%d,%d,%d)]]):
          format(table_num, s_quantity, ol_i_id, ol_supply_w_id))

    i_price=tonumber(i_price)
    w_tax=tonumber(w_tax)
    d_tax=tonumber(d_tax)
    c_discount=tonumber(c_discount)

    ol_amount = ol_quantity * i_price * (1 + w_tax + d_tax) * (1 - c_discount);









    con:query(([[EXECUTE insert_order_line%d (%d,%d,%d,%d,%d,%d,%d,%d,'%s')]]):
                      format(table_num, d_next_o_id, d_id, w_id, ol_number, ol_i_id, ol_supply_w_id, ol_quantity, ol_amount, ol_dist_info))

  end

  con:query("COMMIT")

end