Package org.voltdb.planner

Source Code of org.voltdb.planner.debugTPCCdelivery

/* This file is part of VoltDB.
* Copyright (C) 2008-2010 VoltDB L.L.C.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

package org.voltdb.planner;

import java.util.Date;

import org.voltdb.*;
import org.voltdb.VoltTableRow;
import org.voltdb.benchmark.tpcc.TPCCConstants;

@ProcInfo (
    partitionInfo = "WAREHOUSE.W_ID: 0",
    singlePartition = true
)
public class debugTPCCdelivery extends VoltProcedure {

    private final VoltTable result_template = new VoltTable(
            new VoltTable.ColumnInfo("d_id", VoltType.BIGINT),
            new VoltTable.ColumnInfo("o_id", VoltType.BIGINT)
    );

    final long W_ID = 3L;
    final long D_ID = 7L;
    final long O_ID = 9L;
    final long C_ID = 42L;
    final long I_ID = 12345L;

    public final SQLStmt getWarehouses = new SQLStmt("SELECT * FROM WAREHOUSE;");
    public final SQLStmt getDistricts = new SQLStmt("SELECT * FROM DISTRICT;");
    public final SQLStmt getItems = new SQLStmt("SELECT * FROM ITEM;");
    public final SQLStmt getCustomers = new SQLStmt("SELECT * FROM CUSTOMER;");
    public final SQLStmt getHistorys = new SQLStmt("SELECT * FROM HISTORY;");
    public final SQLStmt getStocks = new SQLStmt("SELECT * FROM STOCK;");
    public final SQLStmt getOrders = new SQLStmt("SELECT * FROM ORDERS;");
    public final SQLStmt getNewOrders = new SQLStmt("SELECT * FROM NEW_ORDER;");
    public final SQLStmt getOrderlines = new SQLStmt("SELECT * FROM ORDER_LINE;");

    public final SQLStmt insertWarehouse = new SQLStmt("INSERT INTO WAREHOUSE VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);");
    public final SQLStmt insertDistrict = new SQLStmt("INSERT INTO DISTRICT VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
    public final SQLStmt insertCustomer = new SQLStmt("INSERT INTO CUSTOMER VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
    public final SQLStmt insertOrders = new SQLStmt("INSERT INTO ORDERS VALUES (?, ?, ?, ?, ?, ?, ?, ?);");
    public final SQLStmt insertOrderLine = new SQLStmt("INSERT INTO ORDER_LINE VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
    public final SQLStmt insertNewOrder = new SQLStmt("INSERT INTO NEW_ORDER VALUES (?, ?, ?);");

    // delivery procs
    public final SQLStmt getNewOrder = new SQLStmt("SELECT NO_O_ID FROM NEW_ORDER WHERE NO_D_ID = ? AND NO_W_ID = ? AND NO_O_ID > -1 LIMIT 1;");
    public final SQLStmt deleteNewOrder = new SQLStmt("DELETE FROM NEW_ORDER WHERE NO_D_ID = ? AND NO_W_ID = ? AND NO_O_ID = ?;");
    public final SQLStmt getCId = new SQLStmt("SELECT O_C_ID FROM ORDERS WHERE O_ID = ? AND O_D_ID = ? AND O_W_ID = ?;");
    public final SQLStmt updateOrders = new SQLStmt("UPDATE ORDERS SET O_CARRIER_ID = ? WHERE O_ID = ? AND O_D_ID = ? AND O_W_ID = ?;");
    public final SQLStmt updateOrderLine = new SQLStmt("UPDATE ORDER_LINE SET OL_DELIVERY_D = ? WHERE OL_O_ID = ? AND OL_D_ID = ? AND OL_W_ID = ?;");
    public final SQLStmt sumOLAmount = new SQLStmt("SELECT SUM(OL_AMOUNT) FROM ORDER_LINE WHERE OL_O_ID = ? AND OL_D_ID = ? AND OL_W_ID = ?;");
    public final SQLStmt updateCustomer = new SQLStmt("UPDATE CUSTOMER SET C_BALANCE = C_BALANCE + ? WHERE C_ID = ? AND C_D_ID = ? AND C_W_ID = ?;");

    public VoltTable[] run(long zip) throws VoltAbortException {
        Date timestamp = new Date();
        long o_carrier_id = 10L;

        voltQueueSQL(insertDistrict, 7L, 3L, "A District", "Street Addy", "meh", "westerfield", "BA", "99999", .0825, 15241.45, 21L);
        // check that a district was inserted
        long results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        voltQueueSQL(insertWarehouse, 3L, "EZ Street WHouse", "Headquarters", "77 Mass. Ave.", "Cambridge", "AZ", "12938", .1234, 18837.57);
        // check that a warehouse was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        voltQueueSQL(insertCustomer, 5L, D_ID, W_ID, "We", "Represent", "Customer", "Random Department", "Place2", "BiggerPlace",
                "AL", "13908", "(913) 909 - 0928", new Date(), "GC", 19298943.12, .13, 15.75, 18832.45, 45L, 15L, "Some History");
        // check that a customer was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        final long O_OL_CNT = 1;
        voltQueueSQL(insertOrders, O_ID, D_ID, W_ID, 5L, new Date(), 10L, O_OL_CNT, 1L);
        // check that an orders was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        voltQueueSQL(insertOrderLine, O_ID, D_ID, W_ID, 1L, I_ID, W_ID, null, 1L, 1.0, "ol_dist_info");
        // check that an orderline was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        voltQueueSQL(insertOrderLine, O_ID, D_ID, W_ID, 2L, I_ID + 1, W_ID, null, 1L, 1.0, "ol_dist_info");
        // check that an orderline was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        voltQueueSQL(insertNewOrder, O_ID, D_ID, W_ID);
        // check that an orders was inserted
        results = voltExecuteSQL()[0].asScalarLong();
        assert(results == 1);

        for (long d_id  = 1; d_id <= TPCCConstants.DISTRICTS_PER_WAREHOUSE; ++d_id) {
            voltQueueSQL(getNewOrder, d_id, W_ID);
        }
        final VoltTable[] neworderresults = voltExecuteSQL();
        assert neworderresults.length == TPCCConstants.DISTRICTS_PER_WAREHOUSE;
        final Long[] no_o_ids = new Long[TPCCConstants.DISTRICTS_PER_WAREHOUSE];
        int valid_neworders = 0;
        int[] result_offsets = new int[TPCCConstants.DISTRICTS_PER_WAREHOUSE];
        for (long d_id  = 1; d_id <= TPCCConstants.DISTRICTS_PER_WAREHOUSE; ++d_id) {
            final VoltTable newOrder = neworderresults[(int) d_id - 1];

            if (newOrder.getRowCount() == 0) {
                // No orders for this district: skip it. Note: This must be reported if > 1%
                result_offsets[(int) d_id - 1] = -1;
                continue;
            }
            assert newOrder.getRowCount() == 1;

            result_offsets[(int) d_id - 1] = valid_neworders * 2;
            ++valid_neworders;
            final Long no_o_id = newOrder.asScalarLong();
            no_o_ids[(int) d_id - 1] = no_o_id;

            voltQueueSQL(getOrderlines);
            VoltTable olResult = voltExecuteSQL()[0];
            try {
                System.out.println("All Orderlines: " + olResult.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }

            voltQueueSQL(sumOLAmount, no_o_id, d_id, W_ID);
            VoltTable sumResult = voltExecuteSQL()[0];
            try {
                System.out.println("Sum Result: " + sumResult.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }

            voltQueueSQL(getCId, no_o_id, d_id, W_ID);
            voltQueueSQL(sumOLAmount, no_o_id, d_id, W_ID);
        }
        final VoltTable[] otherresults = voltExecuteSQL();
        assert otherresults.length == valid_neworders * 2;

        for (long d_id  = 1; d_id <= TPCCConstants.DISTRICTS_PER_WAREHOUSE; ++d_id) {
            final VoltTable newOrder = neworderresults[(int) d_id - 1];

            if (newOrder.getRowCount() == 0) {
                // No orders for this district: skip it. Note: This must be reported if > 1%
                continue;
            }
            assert newOrder.getRowCount() == 1;

            final Long no_o_id = newOrder.asScalarLong();
            no_o_ids[(int) d_id - 1] = no_o_id;
            voltQueueSQL(deleteNewOrder, d_id, W_ID, no_o_id);
            voltQueueSQL(updateOrders, o_carrier_id, no_o_id, d_id, W_ID);
            voltQueueSQL(updateOrderLine, timestamp, no_o_id, d_id, W_ID);
        }
        voltExecuteSQL();

        // these must be logged in the "result file" according to TPC-C 2.7.2.2 (page 39)
        // We remove the queued time, completed time, w_id, and o_carrier_id: the client can figure
        // them out
        final VoltTable result = result_template.clone(8192);
        for (long d_id  = 1; d_id <= TPCCConstants.DISTRICTS_PER_WAREHOUSE; ++d_id) {
            int resultoffset = result_offsets[(int) d_id - 1];

            if (resultoffset < 0) {
                continue;
            }
            assert otherresults[resultoffset + 0].getRowCount() == 1;
            assert otherresults[resultoffset + 1].getRowCount() == 1;
            final long c_id = (otherresults[resultoffset + 0].asScalarLong());
            final VoltTableRow row = otherresults[resultoffset + 1].fetchRow(0);
            final double ol_total = row.getDouble(0);
            final boolean ol_total_wasnull = row.wasNull();

            // If there are no order lines, SUM returns null. There should always be order lines.
            if (ol_total_wasnull) {
                throw new VoltAbortException(
                        "ol_total is NULL: there are no order lines. This should not happen");
            }
            assert ol_total > 0.0;

            voltQueueSQL(updateCustomer, ol_total, c_id, d_id, W_ID);

            final Long no_o_id = no_o_ids[(int) d_id - 1];
            result.addRow(d_id, no_o_id);
        }
        voltExecuteSQL();

        VoltTableRow r = result.fetchRow(0);
        assert(D_ID == r.getLong(0));
        assert(O_ID == r.getLong(1));

        return null;
    }
}
TOP

Related Classes of org.voltdb.planner.debugTPCCdelivery

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.