Skip to content

Commit 062d0fa

Browse files
authored
Use query builder in DiskSpaceV query generation (#321)
1 parent ce1bc75 commit 062d0fa

File tree

3 files changed

+134
-24
lines changed

3 files changed

+134
-24
lines changed

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

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@
3131
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.SelectExpression.union;
3232
import static java.util.stream.Collectors.toList;
3333

34+
import com.google.auto.value.AutoValue;
3435
import com.google.common.collect.ImmutableList;
3536
import com.google.common.primitives.Ints;
3637
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.Expression;
3738
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.OrderBySpec;
3839
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.OrderBySpec.Direction;
3940
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.SelectExpression;
41+
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.SelectExpression.AfterWhereStepBuilder;
4042
import com.google.edwmigration.dumper.application.dumper.connector.teradata.query.model.SelectExpression.FromClauseStepBuilder;
4143
import java.util.List;
4244
import java.util.Optional;
@@ -108,21 +110,59 @@ static String createSelectForTableTextV(
108110
.generate();
109111
}
110112

113+
static String createSelectForDiskSpaceV(OptionalLong rowCount, Optional<Expression> condition) {
114+
Optional<LimitedSelectParams> params =
115+
optionalIf(
116+
rowCount.isPresent(),
117+
() -> LimitedSelectParams.create(rowCount.getAsLong(), "CurrentPerm"));
118+
return select("%s")
119+
.from(subquery(createLimitedSelect(params, "DBC.DiskSpaceV", condition)))
120+
.as("t")
121+
.serialize();
122+
}
123+
111124
private static SelectExpression createSingleDbKindSelectFromDatabasesV(
112125
String dbKind, OptionalLong rowCount, Optional<Expression> condition) {
113-
String tableName = "DBC.DatabasesV";
114126
Expression dbKindCondition = eq(identifier("DBKind"), stringLiteral(dbKind));
115-
Expression processedCondition =
116-
condition
117-
.<Expression>map(innerCondition -> and(innerCondition, dbKindCondition))
118-
.orElse(dbKindCondition);
119-
if (rowCount.isPresent()) {
120-
return selectTop(rowCount.getAsLong(), projection(star()))
121-
.from(tableName)
122-
.where(processedCondition)
123-
.orderBy(OrderBySpec.create(identifier("PermSpace"), Direction.DESC));
124-
} else {
125-
return selectAll().from(tableName).where(processedCondition).build();
127+
Optional<LimitedSelectParams> params =
128+
optionalIf(
129+
rowCount.isPresent(),
130+
() -> LimitedSelectParams.create(rowCount.getAsLong(), "PermSpace"));
131+
return createLimitedSelect(
132+
params,
133+
"DBC.DatabasesV",
134+
Optional.of(
135+
condition
136+
.<Expression>map(innerCondition -> and(innerCondition, dbKindCondition))
137+
.orElse(dbKindCondition)));
138+
}
139+
140+
private static SelectExpression createLimitedSelect(
141+
Optional<LimitedSelectParams> params, String tableName, Optional<Expression> condition) {
142+
FromClauseStepBuilder builder =
143+
params
144+
.map(
145+
innerParams ->
146+
selectTop(innerParams.rowCount(), projection(star())).from(tableName))
147+
.orElseGet(() -> selectAll().from(tableName));
148+
AfterWhereStepBuilder builder2 = condition.map(builder::where).orElse(builder);
149+
return params
150+
.map(
151+
innerParams ->
152+
builder2.orderBy(
153+
OrderBySpec.create(
154+
identifier(innerParams.orderByColumnDesc()), Direction.DESC)))
155+
.orElseGet(builder2::build);
156+
}
157+
158+
@AutoValue
159+
abstract static class LimitedSelectParams {
160+
abstract long rowCount();
161+
162+
abstract String orderByColumnDesc();
163+
164+
static LimitedSelectParams create(long rowCount, String orderByColumnDesc) {
165+
return new AutoValue_MetadataQueryGenerator_LimitedSelectParams(rowCount, orderByColumnDesc);
126166
}
127167
}
128168
}

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

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.DBC_INFO_QUERY;
2020
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.TABLE_TEXT_V_REQUEST_TEXT_LENGTH;
2121
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForAllTempTablesVX;
22+
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForDiskSpaceV;
2223
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForTableTextV;
2324
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSimpleSelect;
2425
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.TeradataUtils.formatQuery;
@@ -272,19 +273,12 @@ private TeradataJdbcSelectTask createTaskForTableSizeV(
272273
private TeradataJdbcSelectTask createTaskForDiskSpaceV(
273274
Optional<Expression> databaseNameCondition, ConnectorArguments arguments)
274275
throws MetadataDumperUsageException {
275-
StringBuilder query = new StringBuilder();
276-
query.append("SELECT %s FROM (");
277-
appendSelect(
278-
query,
279-
parseMaxRows(arguments, TeradataMetadataConnectorProperties.DISK_SPACE_V_MAX_ROWS),
280-
" * FROM DBC.DiskSpaceV "
281-
+ databaseNameCondition
282-
.map(condition -> "WHERE " + ExpressionSerializer.serialize(condition))
283-
.orElse(""),
284-
" ORDER BY CurrentPerm DESC ");
285-
query.append(") AS t;");
276+
OptionalLong maxRows =
277+
parseMaxRows(arguments, TeradataMetadataConnectorProperties.DISK_SPACE_V_MAX_ROWS);
286278
return new TeradataJdbcSelectTask(
287-
DiskSpaceVFormat.ZIP_ENTRY_NAME, TaskCategory.OPTIONAL, formatQuery(query.toString()));
279+
DiskSpaceVFormat.ZIP_ENTRY_NAME,
280+
TaskCategory.OPTIONAL,
281+
createSelectForDiskSpaceV(maxRows, databaseNameCondition));
288282
}
289283

290284
private static OptionalLong parseMaxRows(

dumper/app/src/test/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/MetadataQueryGeneratorTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.DBC_INFO_QUERY;
2020
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForAllTempTablesVX;
21+
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForDiskSpaceV;
2122
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.MetadataQueryGenerator.createSelectForTableTextV;
2223
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.query.TeradataSelectBuilder.eq;
2324
import static com.google.edwmigration.dumper.application.dumper.connector.teradata.query.TeradataSelectBuilder.identifier;
@@ -37,34 +38,40 @@ public class MetadataQueryGeneratorTest {
3738

3839
@Test
3940
public void createSelectForDatabasesV_noLimits() {
41+
// Act
4042
String query =
4143
MetadataQueryGenerator.createSelectForDatabasesV(
4244
/* userRows= */ OptionalLong.empty(),
4345
/* dbRows= */ OptionalLong.empty(),
4446
/* condition= */ Optional.empty());
4547

48+
// Assert
4649
assertQueryEquals("SELECT %s FROM DBC.DatabasesV", query);
4750
}
4851

4952
@Test
5053
public void createSelectForDatabasesV_condition() {
54+
// Act
5155
String query =
5256
MetadataQueryGenerator.createSelectForDatabasesV(
5357
/* userRows= */ OptionalLong.empty(),
5458
/* dbRows= */ OptionalLong.empty(),
5559
/* condition= */ Optional.of(eq(identifier("DatabaseName"), stringLiteral("abc"))));
5660

61+
// Assert
5762
assertQueryEquals("SELECT %s FROM DBC.DatabasesV WHERE DatabaseName = 'abc'", query);
5863
}
5964

6065
@Test
6166
public void createSelectForDatabasesV_usersLimit() {
67+
// Act
6268
String query =
6369
MetadataQueryGenerator.createSelectForDatabasesV(
6470
/* userRows= */ OptionalLong.of(13),
6571
/* dbRows= */ OptionalLong.empty(),
6672
/* condition= */ Optional.empty());
6773

74+
// Assert
6875
assertQueryEquals(
6976
"SELECT %s FROM ("
7077
+ " SELECT * FROM (SELECT TOP 13 * FROM DBC.DatabasesV"
@@ -77,12 +84,14 @@ public void createSelectForDatabasesV_usersLimit() {
7784

7885
@Test
7986
public void createSelectForDatabasesV_usersLimitAndCondition() {
87+
// Act
8088
String query =
8189
MetadataQueryGenerator.createSelectForDatabasesV(
8290
/* userRows= */ OptionalLong.of(13),
8391
/* dbRows= */ OptionalLong.empty(),
8492
/* condition= */ Optional.of(eq(identifier("DatabaseName"), stringLiteral("abc"))));
8593

94+
// Assert
8695
assertQueryEquals(
8796
"SELECT %s FROM ("
8897
+ " SELECT * FROM (SELECT TOP 13 * FROM DBC.DatabasesV"
@@ -96,12 +105,14 @@ public void createSelectForDatabasesV_usersLimitAndCondition() {
96105

97106
@Test
98107
public void createSelectForDatabasesV_dbsLimit() {
108+
// Act
99109
String query =
100110
MetadataQueryGenerator.createSelectForDatabasesV(
101111
/* userRows= */ OptionalLong.empty(),
102112
/* dbRows= */ OptionalLong.of(18),
103113
/* condition= */ Optional.empty());
104114

115+
// Assert
105116
assertQueryEquals(
106117
"SELECT %s FROM ("
107118
+ " SELECT * FROM (SELECT * FROM DBC.DatabasesV WHERE DBKind = 'U') AS users"
@@ -114,12 +125,14 @@ public void createSelectForDatabasesV_dbsLimit() {
114125

115126
@Test
116127
public void createSelectForDatabasesV_usersAndDbsLimit() {
128+
// Act
117129
String query =
118130
MetadataQueryGenerator.createSelectForDatabasesV(
119131
/* userRows= */ OptionalLong.of(15),
120132
/* dbRows= */ OptionalLong.of(18),
121133
/* condition= */ Optional.empty());
122134

135+
// Assert
123136
assertQueryEquals(
124137
"SELECT %s FROM ("
125138
+ " SELECT * FROM (SELECT TOP 15 * FROM DBC.DatabasesV"
@@ -133,13 +146,15 @@ public void createSelectForDatabasesV_usersAndDbsLimit() {
133146

134147
@Test
135148
public void createSelectForDatabasesV_usersAndDbsLimitAndCondition() {
149+
// Act
136150
String query =
137151
MetadataQueryGenerator.createSelectForDatabasesV(
138152
/* userRows= */ OptionalLong.of(15),
139153
/* dbRows= */ OptionalLong.of(18),
140154
/* condition= */ Optional.of(
141155
in(identifier("DatabaseName"), ImmutableList.of("db1", "db2"))));
142156

157+
// Assert
143158
assertQueryEquals(
144159
"SELECT %s FROM ("
145160
+ " SELECT * FROM (SELECT TOP 15 * FROM DBC.DatabasesV"
@@ -171,10 +186,12 @@ public void createSimpleSelect_success() {
171186

172187
@Test
173188
public void createSimpleSelect_withCondition() {
189+
// Act
174190
String query =
175191
MetadataQueryGenerator.createSimpleSelect(
176192
"SampleTable", Optional.of(eq(identifier("col_a"), stringLiteral("abc"))));
177193

194+
// Assert
178195
assertQueryEquals("SELECT %s FROM SampleTable WHERE col_a = 'abc'", query);
179196
}
180197

@@ -193,9 +210,12 @@ public void createSelectForAllTempTablesVX_withDatabaseFiltering_success() {
193210

194211
@Test
195212
public void createSelectForTableTextV_success() {
213+
// Act
196214
String query =
197215
createSelectForTableTextV(
198216
/* textMaxLength= */ OptionalLong.empty(), /* condition= */ Optional.empty());
217+
218+
// Assert
199219
assertQueryEquals("SELECT %s FROM DBC.TableTextV", query);
200220
}
201221

@@ -253,4 +273,60 @@ public void createSelectForTableTextV_withTextMaxLengthAndCondition() {
253273
+ " WHERE DatabaseName = 'sample_db'",
254274
query);
255275
}
276+
277+
@Test
278+
public void createSelectForDiskSpaceV_success() {
279+
// Act
280+
String query =
281+
createSelectForDiskSpaceV(
282+
/* rowCount= */ OptionalLong.empty(), /* condition= */ Optional.empty());
283+
284+
// Assert
285+
assertQueryEquals("SELECT %s FROM (SELECT * FROM DBC.DiskSpaceV) AS t", query);
286+
}
287+
288+
@Test
289+
public void createSelectForDiskSpaceV_withCondition() {
290+
// Act
291+
String query =
292+
createSelectForDiskSpaceV(
293+
/* rowCount= */ OptionalLong.empty(),
294+
/* condition= */ Optional.of(
295+
eq(identifier("DatabaseName"), stringLiteral("sample_db"))));
296+
297+
// Assert
298+
assertQueryEquals(
299+
"SELECT %s FROM (SELECT * FROM DBC.DiskSpaceV WHERE DatabaseName = 'sample_db') AS t",
300+
query);
301+
}
302+
303+
@Test
304+
public void createSelectForDiskSpaceV_withLimit() {
305+
// Act
306+
String query =
307+
createSelectForDiskSpaceV(
308+
/* rowCount= */ OptionalLong.of(15), /* condition= */ Optional.empty());
309+
310+
// Assert
311+
assertQueryEquals(
312+
"SELECT %s FROM (SELECT TOP 15 * FROM DBC.DiskSpaceV ORDER BY CurrentPerm DESC) AS t",
313+
query);
314+
}
315+
316+
@Test
317+
public void createSelectForDiskSpaceV_withLimitAndCondition() {
318+
// Act
319+
String query =
320+
createSelectForDiskSpaceV(
321+
/* rowCount= */ OptionalLong.of(78),
322+
/* condition= */ Optional.of(
323+
eq(identifier("DatabaseName"), stringLiteral("sample_db"))));
324+
325+
// Assert
326+
assertQueryEquals(
327+
"SELECT %s FROM (SELECT TOP 78 * FROM DBC.DiskSpaceV"
328+
+ " WHERE DatabaseName = 'sample_db'"
329+
+ " ORDER BY CurrentPerm DESC) AS t",
330+
query);
331+
}
256332
}

0 commit comments

Comments
 (0)