/** * */ package edu.washington.escience.myria.accessmethod; import static org.junit.Assert.assertEquals; import java.util.Objects; import org.junit.Test; import org.slf4j.LoggerFactory; import com.google.common.base.Verify; import com.google.common.collect.ImmutableList; import edu.washington.escience.myria.DbException; import edu.washington.escience.myria.MyriaConstants; import edu.washington.escience.myria.RelationKey; import edu.washington.escience.myria.Schema; import edu.washington.escience.myria.Type; import edu.washington.escience.myria.operator.BatchTupleSource; import edu.washington.escience.myria.operator.DbInsert; import edu.washington.escience.myria.operator.DbQueryScan; import edu.washington.escience.myria.operator.LeafOperator; import edu.washington.escience.myria.operator.TupleRangeSource; import edu.washington.escience.myria.storage.TupleBatch; import edu.washington.escience.myria.storage.TupleBatchBuffer; import edu.washington.escience.myria.util.TestEnvVars; import edu.washington.escience.myria.util.TestUtils; /** * */ public class JdbcAccessMethodTest { /** The logger for this class. */ protected static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(JdbcAccessMethod.class); private static final String POSTGRES_DRIVER_CLASS = "org.postgresql.Driver"; private static final int POSTGRES_PORT = 5432; private static final String POSTGRES_DATABASE_NAME = "myria_test"; private JdbcInfo getJdbcInfo(final String dbms) { Verify.verify(TestUtils.inTravis(), "This test should only run in Travis"); /* Return localhost using Travis' default credentials. */ return JdbcInfo.of( POSTGRES_DRIVER_CLASS, MyriaConstants.STORAGE_SYSTEM_POSTGRESQL, "localhost", POSTGRES_PORT, POSTGRES_DATABASE_NAME, "postgres", ""); } private void testInsertTuplesAndCountThem(final String dbms) throws DbException { final int expectedNumResults = 250; TupleRangeSource source = new TupleRangeSource(expectedNumResults, Type.DOUBLE_TYPE); doInsert(dbms, source, expectedNumResults); } private void testInsertTuplesAndCountThemWithNull(final String dbms) throws DbException { final int expectedNumResults = 250; TupleBatchBuffer data = new TupleBatchBuffer( Schema.of(ImmutableList.of(Type.STRING_TYPE), ImmutableList.of("value"))); for (int i = 0; i < expectedNumResults; i++) { if (i % 2 == 0) { data.putString(0, ""); } else { data.putString(0, String.valueOf(i)); } } BatchTupleSource source = new BatchTupleSource(data); doInsert(dbms, source, expectedNumResults); } private void doInsert(final String dbms, final LeafOperator source, final int expectedNumResults) throws DbException { Objects.requireNonNull(dbms, "dbms"); /* Connection information */ final JdbcInfo jdbcInfo = getJdbcInfo(dbms); /* First, insert tuples into the database. */ final Schema schema = source.getSchema(); final RelationKey relation = RelationKey.of("myria", "test", dbms); DbInsert insert = new DbInsert(source, relation, jdbcInfo, true); /* Run to completion. */ insert.open(TestEnvVars.get()); while (!insert.eos()) { insert.nextReady(); } insert.close(); /* Next get all the tables back out. */ DbQueryScan scan = new DbQueryScan(jdbcInfo, relation, schema); /* Count up the results and assert they match expectations */ int count = 0; scan.open(TestEnvVars.get()); TupleBatch tb = null; while (!scan.eos()) { tb = scan.nextReady(); if (tb != null) { count += tb.numTuples(); } } /* Cleanup */ scan.close(); /* Test it. */ assertEquals(expectedNumResults, count); } @Test public void testInsertTuplesAndCountThemPostgreSQL() throws DbException { TestUtils.requireTravis(); testInsertTuplesAndCountThem(MyriaConstants.STORAGE_SYSTEM_POSTGRESQL); testInsertTuplesAndCountThemWithNull(MyriaConstants.STORAGE_SYSTEM_POSTGRESQL); } }