Skip to content

Commit b656fe4

Browse files
authored
Remove teradata14 inheritance (#191)
1 parent 2319454 commit b656fe4

File tree

6 files changed

+134
-31
lines changed

6 files changed

+134
-31
lines changed

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/AbstractTeradataConnector.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package com.google.edwmigration.dumper.application.dumper.connector.teradata;
1818

19+
import com.google.common.annotations.VisibleForTesting;
1920
import com.google.common.base.Preconditions;
2021
import com.google.common.io.ByteSink;
2122
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
@@ -36,7 +37,11 @@
3637
import java.sql.Driver;
3738
import java.sql.PreparedStatement;
3839
import java.sql.SQLException;
40+
import java.time.ZoneOffset;
41+
import java.time.format.DateTimeFormatter;
3942
import java.util.List;
43+
import java.util.concurrent.ConcurrentHashMap;
44+
import java.util.concurrent.ConcurrentMap;
4045
import javax.annotation.Nonnull;
4146
import javax.sql.DataSource;
4247
import org.slf4j.Logger;
@@ -76,6 +81,10 @@ public abstract class AbstractTeradataConnector extends AbstractJdbcConnector {
7681
private static final Logger LOG = LoggerFactory.getLogger(AbstractTeradataConnector.class);
7782

7883
public static final int OPT_PORT_DEFAULT = 1025;
84+
protected static final DateTimeFormatter SQL_FORMAT =
85+
DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneOffset.UTC);
86+
@VisibleForTesting /* pp */ static final String DEF_LOG_TABLE = "dbc.DBQLogTbl";
87+
@VisibleForTesting /* pp */ static final String DEF_QUERY_TABLE = "dbc.DBQLSQLTbl";
7988

8089
protected static class TeradataJdbcSelectTask extends JdbcSelectTask {
8190

@@ -132,6 +141,19 @@ protected Void doInConnection(
132141
}
133142
}
134143

144+
/** This is shared between all instances of TeradataLogsJdbcTask. */
145+
protected static class SharedState {
146+
/**
147+
* Whether a particular expression is valid against the particular target Teradata version. This
148+
* is a concurrent Map of immutable objects, so is threadsafe overall.
149+
*/
150+
protected final ConcurrentMap<String, Boolean> expressionValidity = new ConcurrentHashMap<>();
151+
}
152+
153+
protected static boolean isQueryTable(@Nonnull String expression) {
154+
return expression.startsWith("ST.");
155+
}
156+
135157
/* pp */ AbstractTeradataConnector(@Nonnull String name) {
136158
super(name);
137159
}

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/Teradata14LogsConnector.java

Lines changed: 107 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818

1919
import com.google.auto.service.AutoService;
2020
import com.google.common.annotations.VisibleForTesting;
21+
import com.google.common.base.Preconditions;
22+
import com.google.common.base.Predicates;
23+
import com.google.common.io.ByteSink;
2124
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2225
import com.google.edwmigration.dumper.application.dumper.MetadataDumperUsageException;
2326
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsArgumentQueryLogDays;
@@ -27,27 +30,38 @@
2730
import com.google.edwmigration.dumper.application.dumper.connector.LogsConnector;
2831
import com.google.edwmigration.dumper.application.dumper.connector.ZonedInterval;
2932
import com.google.edwmigration.dumper.application.dumper.connector.ZonedIntervalIterable;
33+
import com.google.edwmigration.dumper.application.dumper.handle.JdbcHandle;
34+
import com.google.edwmigration.dumper.application.dumper.task.AbstractJdbcTask;
3035
import com.google.edwmigration.dumper.application.dumper.task.DumpMetadataTask;
3136
import com.google.edwmigration.dumper.application.dumper.task.FormatTask;
3237
import com.google.edwmigration.dumper.application.dumper.task.Task;
38+
import com.google.edwmigration.dumper.application.dumper.task.TaskRunContext;
3339
import com.google.edwmigration.dumper.plugin.ext.jdk.annotation.Description;
3440
import com.google.edwmigration.dumper.plugin.lib.dumper.spi.TeradataLogsDumpFormat;
41+
import java.sql.Connection;
42+
import java.sql.SQLException;
3543
import java.time.format.DateTimeFormatter;
3644
import java.util.ArrayList;
45+
import java.util.Collections;
3746
import java.util.List;
47+
import java.util.function.Function;
3848
import java.util.function.Predicate;
3949
import javax.annotation.Nonnull;
4050
import org.apache.commons.lang3.StringUtils;
4151
import org.slf4j.Logger;
4252
import org.slf4j.LoggerFactory;
53+
import org.springframework.dao.DataAccessException;
54+
import org.springframework.jdbc.core.JdbcTemplate;
55+
import org.springframework.jdbc.core.ResultSetExtractor;
4356

4457
/** */
4558
@AutoService({Connector.class, LogsConnector.class})
4659
@Description("Dumps logs from Teradata version <=14.")
4760
@RespectsArgumentQueryLogDays
4861
@RespectsArgumentQueryLogStart
4962
@RespectsArgumentQueryLogEnd
50-
public class Teradata14LogsConnector extends TeradataLogsConnector {
63+
public class Teradata14LogsConnector extends AbstractTeradataConnector
64+
implements LogsConnector, TeradataLogsDumpFormat {
5165

5266
private static final Logger LOG = LoggerFactory.getLogger(Teradata14LogsConnector.class);
5367

@@ -70,7 +84,95 @@ public Teradata14LogsConnector() {
7084
super("teradata14-logs");
7185
}
7286

73-
private static class LSqlQueryFactory extends TeradataLogsJdbcTask {
87+
private abstract static class Teradata14LogsJdbcTask extends AbstractJdbcTask<Void> {
88+
89+
protected static String EXPRESSION_VALIDITY_QUERY = "SELECT TOP 1 %s FROM %s";
90+
91+
protected final SharedState state;
92+
protected final String logTable;
93+
protected final String queryTable;
94+
protected final List<String> conditions;
95+
protected final ZonedInterval interval;
96+
protected final List<String> orderBy;
97+
98+
public Teradata14LogsJdbcTask(
99+
@Nonnull String targetPath,
100+
SharedState state,
101+
String logTable,
102+
String queryTable,
103+
List<String> conditions,
104+
ZonedInterval interval) {
105+
this(targetPath, state, logTable, queryTable, conditions, interval, Collections.emptyList());
106+
}
107+
108+
protected Teradata14LogsJdbcTask(
109+
@Nonnull String targetPath,
110+
SharedState state,
111+
String logTable,
112+
String queryTable,
113+
List<String> conditions,
114+
ZonedInterval interval,
115+
List<String> orderBy) {
116+
super(targetPath);
117+
this.state = Preconditions.checkNotNull(state, "SharedState was null.");
118+
this.logTable = logTable;
119+
this.queryTable = queryTable;
120+
this.conditions = conditions;
121+
this.interval = interval;
122+
this.orderBy = orderBy;
123+
}
124+
125+
@Override
126+
protected Void doInConnection(
127+
TaskRunContext context, JdbcHandle jdbcHandle, ByteSink sink, Connection connection)
128+
throws SQLException {
129+
String sql = getSql(jdbcHandle);
130+
ResultSetExtractor<Void> rse = newCsvResultSetExtractor(sink, -1);
131+
return doSelect(connection, rse, sql);
132+
}
133+
134+
@Nonnull
135+
private String getSql(@Nonnull JdbcHandle handle) {
136+
Function<String, Boolean> validator =
137+
expression -> isValid(handle.getJdbcTemplate(), expression);
138+
Predicate<String> predicate =
139+
expression -> state.expressionValidity.computeIfAbsent(expression, validator);
140+
String sql = getSql(predicate);
141+
// LOG.debug("SQL is " + sql);
142+
return sql;
143+
}
144+
145+
@Nonnull
146+
protected abstract String getSql(@Nonnull Predicate<? super String> predicate);
147+
148+
/**
149+
* Runs a test query to check whether a given projection expression is legal on this Teradata
150+
* instance.
151+
*/
152+
@Nonnull
153+
private Boolean isValid(@Nonnull JdbcTemplate template, @Nonnull String expression) {
154+
String table = isQueryTable(expression) ? queryTable + " ST" : logTable + " L";
155+
String sql = String.format(EXPRESSION_VALIDITY_QUERY, expression, table);
156+
LOG.info("Checking legality of projection expression '{}' using query: {}", expression, sql);
157+
try {
158+
template.query(sql, rs -> {});
159+
return Boolean.TRUE;
160+
} catch (DataAccessException e) {
161+
LOG.info(
162+
"Attribute '{}' is absent, will use NULL in projection: {}",
163+
expression,
164+
e.getMessage());
165+
return Boolean.FALSE;
166+
}
167+
}
168+
169+
@Override
170+
public String toString() {
171+
return getSql(Predicates.alwaysTrue());
172+
}
173+
}
174+
175+
private static class LSqlQueryFactory extends Teradata14LogsJdbcTask {
74176

75177
public LSqlQueryFactory(
76178
String targetPath,
@@ -84,7 +186,7 @@ public LSqlQueryFactory(
84186

85187
@Override
86188
@Nonnull
87-
String getSql(@Nonnull Predicate<? super String> predicate) {
189+
protected String getSql(@Nonnull Predicate<? super String> predicate) {
88190
StringBuilder buf = new StringBuilder("SELECT ");
89191

90192
String separator = "";
@@ -115,7 +217,7 @@ String getSql(@Nonnull Predicate<? super String> predicate) {
115217
}
116218
}
117219

118-
private static class LogQueryFactory extends TeradataLogsJdbcTask {
220+
private static class LogQueryFactory extends Teradata14LogsJdbcTask {
119221

120222
public LogQueryFactory(
121223
String targetPath,
@@ -129,7 +231,7 @@ public LogQueryFactory(
129231

130232
@Override
131233
@Nonnull
132-
String getSql(@Nonnull Predicate<? super String> predicate) {
234+
protected String getSql(@Nonnull Predicate<? super String> predicate) {
133235
StringBuilder buf = new StringBuilder("SELECT ");
134236

135237
String separator = "";

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/TeradataAssessmentLogsJdbcTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.TeradataUtils.createTimestampExpression;
2020

2121
import com.google.edwmigration.dumper.application.dumper.connector.ZonedInterval;
22-
import com.google.edwmigration.dumper.application.dumper.connector.teradata.TeradataLogsConnector.SharedState;
22+
import com.google.edwmigration.dumper.application.dumper.connector.teradata.AbstractTeradataConnector.SharedState;
2323
import java.util.List;
2424
import java.util.function.Predicate;
2525
import javax.annotation.Nonnull;

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/TeradataLogsConnector.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import static com.google.common.collect.ImmutableList.toImmutableList;
2020

2121
import com.google.auto.service.AutoService;
22-
import com.google.common.annotations.VisibleForTesting;
2322
import com.google.common.collect.ImmutableList;
2423
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2524
import com.google.edwmigration.dumper.application.dumper.MetadataDumperUsageException;
@@ -41,8 +40,6 @@
4140
import java.util.ArrayList;
4241
import java.util.Arrays;
4342
import java.util.List;
44-
import java.util.concurrent.ConcurrentHashMap;
45-
import java.util.concurrent.ConcurrentMap;
4643
import javax.annotation.Nonnull;
4744
import org.apache.commons.lang3.StringUtils;
4845
import org.slf4j.Logger;
@@ -62,32 +59,14 @@ public class TeradataLogsConnector extends AbstractTeradataConnector
6259
implements LogsConnector, TeradataLogsDumpFormat {
6360

6461
private static final Logger LOG = LoggerFactory.getLogger(TeradataLogsConnector.class);
65-
66-
@VisibleForTesting /* pp */ static final String DEF_LOG_TABLE = "dbc.DBQLogTbl";
67-
/* pp */ static final String ASSESSMENT_DEF_LOG_TABLE = "dbc.QryLogV";
68-
@VisibleForTesting /* pp */ static final String DEF_QUERY_TABLE = "dbc.DBQLSQLTbl";
62+
private static final String ASSESSMENT_DEF_LOG_TABLE = "dbc.QryLogV";
6963

7064
private static final String DEF_UTILITY_TABLE = "dbc.DBQLUtilityTbl";
7165

7266
public TeradataLogsConnector() {
7367
super("teradata-logs");
7468
}
7569

76-
// to proxy for Terdata14LogsConnector
77-
protected TeradataLogsConnector(@Nonnull String name) {
78-
super(name);
79-
}
80-
81-
/** This is shared between all instances of TeradataLogsJdbcTask. */
82-
protected static class SharedState {
83-
84-
/**
85-
* Whether a particular expression is valid against the particular target Teradata version. This
86-
* is a concurrent Map of immutable objects, so is threadsafe overall.
87-
*/
88-
protected final ConcurrentMap<String, Boolean> expressionValidity = new ConcurrentHashMap<>();
89-
}
90-
9170
private ImmutableList<TeradataJdbcSelectTask> createTimeSeriesTasks(ZonedInterval interval) {
9271
return ImmutableList.of("ResUsageScpu", "ResUsageSpma").stream()
9372
.map(

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/TeradataLogsJdbcTask.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import com.google.common.base.Predicates;
2525
import com.google.common.io.ByteSink;
2626
import com.google.edwmigration.dumper.application.dumper.connector.ZonedInterval;
27-
import com.google.edwmigration.dumper.application.dumper.connector.teradata.TeradataLogsConnector.SharedState;
27+
import com.google.edwmigration.dumper.application.dumper.connector.teradata.AbstractTeradataConnector.SharedState;
2828
import com.google.edwmigration.dumper.application.dumper.handle.JdbcHandle;
2929
import com.google.edwmigration.dumper.application.dumper.task.AbstractJdbcTask;
3030
import com.google.edwmigration.dumper.application.dumper.task.TaskRunContext;
@@ -82,7 +82,7 @@ public class TeradataLogsJdbcTask extends AbstractJdbcTask<Void> {
8282
};
8383

8484
private static final Logger LOG = LoggerFactory.getLogger(TeradataLogsConnector.class);
85-
@VisibleForTesting public static String EXPRESSION_VALIDITY_QUERY = "SELECT TOP 1 %s FROM %s";
85+
@VisibleForTesting /* pp */ static String EXPRESSION_VALIDITY_QUERY = "SELECT TOP 1 %s FROM %s";
8686
protected final SharedState state;
8787
protected final String logTable;
8888
protected final String queryTable;

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/TeradataUtilityLogsJdbcTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import com.google.common.collect.ImmutableList;
2323
import com.google.common.io.ByteSink;
2424
import com.google.edwmigration.dumper.application.dumper.connector.ZonedInterval;
25-
import com.google.edwmigration.dumper.application.dumper.connector.teradata.TeradataLogsConnector.SharedState;
25+
import com.google.edwmigration.dumper.application.dumper.connector.teradata.AbstractTeradataConnector.SharedState;
2626
import com.google.edwmigration.dumper.application.dumper.handle.JdbcHandle;
2727
import com.google.edwmigration.dumper.application.dumper.task.AbstractJdbcTask;
2828
import com.google.edwmigration.dumper.application.dumper.task.TaskRunContext;

0 commit comments

Comments
 (0)