/**
* 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.qp.loadableplan.std;
import com.foundationdb.qp.loadableplan.DirectObjectCursor;
import com.foundationdb.qp.loadableplan.DirectObjectPlan;
import com.foundationdb.qp.loadableplan.std.DumpGroupLoadablePlan;
import com.foundationdb.qp.operator.QueryBindings;
import com.foundationdb.qp.operator.QueryContext;
import com.foundationdb.qp.operator.SimpleQueryContext;
import com.foundationdb.qp.operator.StoreAdapter;
import com.foundationdb.qp.rowtype.Schema;
import com.foundationdb.server.service.transaction.TransactionService.CloseableTransaction;
import com.foundationdb.server.types.mcompat.mtypes.MNumeric;
import com.foundationdb.server.types.mcompat.mtypes.MString;
import com.foundationdb.server.types.value.Value;
import com.foundationdb.sql.TestBase;
import com.foundationdb.sql.embedded.EmbeddedJDBCITBase;
import com.foundationdb.junit.NamedParameterizedRunner;
import com.foundationdb.junit.Parameterization;
import com.foundationdb.junit.ParameterizationBuilder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import java.sql.Statement;
import java.io.File;
import java.util.Collection;
import java.util.List;
@RunWith(NamedParameterizedRunner.class)
public class DumpGroupLoadablePlanIT extends EmbeddedJDBCITBase
{
public static final File RESOURCE_DIR =
new File("src/test/resources/"
+ DumpGroupLoadablePlan.class.getPackage().getName().replace('.', '/'));
public static final File SCHEMA_FILE = new File(RESOURCE_DIR, "schema.ddl");
public static final String GROUP_NAME = "customers";
@NamedParameterizedRunner.TestParameters
public static Collection<Parameterization> params() {
ParameterizationBuilder pb = new ParameterizationBuilder();
pb.add("single", new File(RESOURCE_DIR, GROUP_NAME + ".sql"), GROUP_NAME, false, -1);
pb.add("single/commit", new File(RESOURCE_DIR, GROUP_NAME + ".sql"),GROUP_NAME, false, 1);
pb.add("multiple", new File(RESOURCE_DIR, GROUP_NAME + "-m.sql"),GROUP_NAME, true, -1);
pb.add("multiple/commit", new File(RESOURCE_DIR, GROUP_NAME + "-m.sql"),GROUP_NAME, true, 1);
pb.add("values", new File(RESOURCE_DIR, "values.sql"), "values", true, 1);
pb.add("guid", new File(RESOURCE_DIR, "guid.sql"), "guid_table", true, 1);
pb.add("strings", new File(RESOURCE_DIR, "strings.sql"), "strings", true, 1);
return pb.asList();
}
private File file;
private boolean multiple;
private int commitFreq;
private String groupName;
public DumpGroupLoadablePlanIT(File file, String groupName, boolean multiple, int commitFreq) {
this.file = file;
this.multiple = multiple;
this.commitFreq = commitFreq;
this.groupName = groupName;
}
@Before
public void loadDatabase() throws Exception {
loadSchemaFile(SCHEMA_NAME, SCHEMA_FILE);
}
@Test
public void testDump() throws Exception {
String expectedSQL = runSQL();
try(CloseableTransaction txn = txnService().beginCloseableTransaction(session())) {
runPlan(expectedSQL);
txn.commit();
}
}
private String runSQL() throws Exception {
// Run the INSERTs via SQL.
String sql = TestBase.fileContents(file);
Statement stmt = getConnection().createStatement();
for (String sqls : sql.split("\\;\\s*")) {
stmt.execute(sqls);
}
stmt.close();
return sql;
}
private void runPlan(String expectedSQL) throws Exception {
DumpGroupLoadablePlan loadablePlan = new DumpGroupLoadablePlan();
DirectObjectPlan plan = loadablePlan.plan();
StoreAdapter adapter = newStoreAdapter();
QueryContext queryContext = new SimpleQueryContext(adapter) {
@Override
public String getCurrentSchema() {
return SCHEMA_NAME;
}
};
QueryBindings queryBindings = queryContext.createBindings();
queryBindings.setValue(0, new Value(MString.varcharFor(SCHEMA_NAME), SCHEMA_NAME));
queryBindings.setValue(1, new Value(MString.varcharFor(groupName), groupName));
if (multiple)
queryBindings.setValue(2, new Value(MNumeric.INT.instance(false), 10));
if (commitFreq > 0)
queryBindings.setValue(3, new Value(MNumeric.INT.instance(false), commitFreq));
DirectObjectCursor cursor = plan.cursor(queryContext, queryBindings);
StringBuilder actual = new StringBuilder();
cursor.open();
while(true) {
List<?> columns = cursor.next();
if (columns == null) {
break;
}
else if (!columns.isEmpty()) {
assertTrue(columns.size() == 1);
if (actual.length() > 0)
actual.append("\n");
actual.append(columns.get(0));
}
}
cursor.close();
assertEquals(expectedSQL, actual.toString());
}
}