/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.server.test.pt.qp; import com.foundationdb.ais.model.Group; import com.foundationdb.qp.operator.Cursor; import com.foundationdb.qp.operator.Operator; import com.foundationdb.qp.rowtype.IndexRowType; import com.foundationdb.qp.rowtype.TableRowType; import com.foundationdb.qp.util.SchemaCache; import com.foundationdb.server.error.InvalidOperationException; import com.foundationdb.util.tap.Tap; import com.foundationdb.util.tap.TapReport; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.util.Arrays; import static com.foundationdb.qp.operator.API.*; @Ignore public class SimpleJoinPT extends QPProfilePTBase { @Before public void before() throws InvalidOperationException { customer = createTable( "schema", "customer", "cid int not null", "name varchar(20)", "primary key(cid)"); order = createTable( "schema", "orders", "oid int not null", "cid int", "salesman varchar(20)", "primary key(oid)", "grouping foreign key (cid) references customer(cid)"); item = createTable( "schema", "item", "iid int not null", "oid int", "primary key(iid)", "grouping foreign key (oid) references orders(oid)"); address = createTable( "schema", "address", "aid int not null", "cid int", "address varchar(100)", "primary key(aid)", "grouping foreign key (cid) references customer(cid)"); createIndex("schema", "customer", "idx_cname", "name"); createIndex("schema", "orders", "idx_osalesman", "salesman"); createIndex("schema", "address", "idx_aaddress", "address"); schema = SchemaCache.globalSchema(ais()); customerRowType = schema.tableRowType(table(customer)); orderRowType = schema.tableRowType(table(order)); itemRowType = schema.tableRowType(table(item)); addressRowType = schema.tableRowType(table(address)); customerNameIndexRowType = indexType(customer, "name"); orderSalesmanIndexRowType = indexType(order, "salesman"); itemOidIndexRowType = indexType(item, "oid"); itemIidIndexRowType = indexType(item, "iid"); customerCidIndexRowType = indexType(customer, "cid"); addressAddressIndexRowType = indexType(address, "address"); coi = group(customer); adapter = newStoreAdapter(); queryContext = queryContext(adapter); queryBindings = queryContext.createBindings(); } protected void populateDB(int customers, int ordersPerCustomer, int itemsPerOrder) { long cid = 0; long oid = 0; long iid = 0; for (int c = 0; c < customers; c++) { writeRow(customer, cid, String.format("customer %s", cid)); for (int o = 0; o < ordersPerCustomer; o++) { writeRow(order, oid, cid, String.format("salesman %s", oid)); for (int i = 0; i < itemsPerOrder; i++) { writeRow(item, iid, oid); iid++; } oid++; } cid++; } } @Test public void profileGroupScan() { final int SCANS = 100000000; final int CUSTOMERS = 1000; final int ORDERS_PER_CUSTOMER = 5; final int ITEMS_PER_ORDER = 2; populateDB(CUSTOMERS, ORDERS_PER_CUSTOMER, ITEMS_PER_ORDER); Operator plan = flatten_HKeyOrdered( ancestorLookup_Default( indexScan_Default(itemIidIndexRowType), coi, itemIidIndexRowType, Arrays.asList(itemRowType, orderRowType), InputPreservationOption.DISCARD_INPUT), orderRowType, itemRowType, JoinType.INNER_JOIN); Tap.setEnabled(".*", true); for (int s = 0; s < SCANS; s++) { Cursor cursor = cursor(plan, queryContext, queryBindings); cursor.openTopLevel(); while (cursor.next() != null) { } cursor.closeTopLevel(); } TapReport[] reports = Tap.getReport(".*"); for (TapReport report : reports) { System.out.println(report); } } protected int customer; protected int order; protected int item; protected int address; protected TableRowType customerRowType; protected TableRowType orderRowType; protected TableRowType itemRowType; protected TableRowType addressRowType; protected IndexRowType customerCidIndexRowType; protected IndexRowType customerNameIndexRowType; protected IndexRowType orderSalesmanIndexRowType; protected IndexRowType itemOidIndexRowType; protected IndexRowType itemIidIndexRowType; protected IndexRowType addressAddressIndexRowType; protected Group coi; }