/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package gobblin.source.extractor.extract.jdbc;
import static org.testng.Assert.assertEquals;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.mockrunner.mock.jdbc.MockResultSet;
import gobblin.configuration.State;
import gobblin.configuration.WorkUnitState;
import gobblin.source.extractor.extract.CommandOutput;
import gobblin.source.extractor.extract.jdbc.JdbcCommand;
import gobblin.source.extractor.extract.jdbc.JdbcCommandOutput;
import gobblin.source.extractor.extract.jdbc.OracleExtractor;
@Test(groups = { "gobblin.source.extractor.extract.jdbc" })
public class OracleExtractorTest {
private final static List<MockJdbcColumn> COLUMNS = ImmutableList.of(
new MockJdbcColumn("id", "1", Types.INTEGER),
new MockJdbcColumn("name", "name_1", Types.VARCHAR),
new MockJdbcColumn("age", "20", Types.INTEGER));
private static final String QUERY_1 = "SELECT * FROM x WHERE ROWNUM <= 532";
private static final String QUERY_2 = "SELECT * FROM x WHERE ROWNUM <= 5 AND x.a < 10";
private static final String QUERY_3 = "SELECT * FROM x WHERE x.a < 10 AND ROWNUM <= 50";
private static final String QUERY_4 = "SELECT * FROM x WHERE x.a < 10 AND ROWNUM <= 50 AND x.b = 20";
private static final String QUERY_EMPTY = "";
private static final String QUERY_REG = "SELECT * FROM x WHERE x.a < 10";
private CommandOutput<JdbcCommand, ResultSet> output;
private State state;
private OracleExtractor oracleExtractor;
@BeforeClass
public void setup() {
output = new JdbcCommandOutput();
try {
output.put(new JdbcCommand(), buildMockResultSet());
} catch (Exception e) {
// hack for test failure
assertEquals("OracleExtractorTest: error initializing mock result set", "false");
}
state = new WorkUnitState();
state.setId("id");
oracleExtractor = new OracleExtractor((WorkUnitState) state);
}
@Test
public void testConstructSampleClause() throws Exception {
String sClause = oracleExtractor.constructSampleClause();
assertEquals(sClause.trim(), (" rownum <= " + oracleExtractor.getSampleRecordCount()).trim());
}
@Test
public void testRemoveSampleClauseFromQuery() throws Exception {
String q1Expected = "SELECT * FROM x WHERE 1=1";
String q2Expected = "SELECT * FROM x WHERE 1=1 AND x.a < 10";
String q3Expected = "SELECT * FROM x WHERE x.a < 10 AND 1=1";
String q4Expected = "SELECT * FROM x WHERE x.a < 10 AND 1=1 AND x.b = 20";
String qEmptyClean = "";
String q1Parsed = oracleExtractor.removeSampleClauseFromQuery(QUERY_1);
String q2Parsed = oracleExtractor.removeSampleClauseFromQuery(QUERY_2);
String q3Parsed = oracleExtractor.removeSampleClauseFromQuery(QUERY_3);
String q4Parsed = oracleExtractor.removeSampleClauseFromQuery(QUERY_4);
assertEquals(q1Parsed, q1Expected);
assertEquals(q2Parsed, q2Expected);
assertEquals(q3Parsed, q3Expected);
assertEquals(q4Parsed, q4Expected);
}
@Test
public void testExractSampleRecordCountFromQuery() throws Exception {
long res1 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_1);
long res2 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_2);
long res3 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_3);
long res4 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_4);
long res5 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_EMPTY);
long res6 = oracleExtractor.exractSampleRecordCountFromQuery(QUERY_REG);
assertEquals(res1, (long) 532);
assertEquals(res2, (long) 5);
assertEquals(res3, (long) 50);
assertEquals(res4, (long) 50);
assertEquals(res5, (long) -1);
assertEquals(res6, (long) -1);
}
/**
* Build a mock implementation of Result using Mockito
*/
private ResultSet buildMockResultSet() throws Exception {
MockResultSet mrs = new MockResultSet(StringUtils.EMPTY);
for (MockJdbcColumn column : COLUMNS) {
mrs.addColumn(column.getColumnName(), ImmutableList.of(column.getValue()));
}
return mrs;
}
}