From b9f30147d10273dd3efccb00d29d54aa47dc5934 Mon Sep 17 00:00:00 2001 From: Adrika Gupta Date: Wed, 1 Oct 2025 07:56:04 +0000 Subject: [PATCH] fix generate query method --- .../PartitionedBigQueryInputFormat.java | 6 + .../PartitionedBigQueryInputFormatTest.java | 159 +++++++++++------- 2 files changed, 107 insertions(+), 58 deletions(-) diff --git a/src/main/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormat.java b/src/main/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormat.java index 48569eaf1f..e0834f3575 100644 --- a/src/main/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormat.java +++ b/src/main/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormat.java @@ -182,6 +182,12 @@ String generateQuery(String partitionFromDate, String partitionToDate, String fi String datasetProject, String dataset, String table, String limit, String orderBy, Boolean isPartitionFilterRequired, StandardTableDefinition tableDefinition) { + if (Strings.isNullOrEmpty(filter) && Strings.isNullOrEmpty(orderBy) && Strings.isNullOrEmpty( + limit) + && Strings.isNullOrEmpty(partitionFromDate) && Strings.isNullOrEmpty(partitionToDate)) { + return null; + } + RangePartitioning rangePartitioning = tableDefinition.getRangePartitioning(); TimePartitioning timePartitioning = tableDefinition.getTimePartitioning(); StringBuilder condition = new StringBuilder(); diff --git a/src/test/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormatTest.java b/src/test/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormatTest.java index 2f850d89d9..313d3432e0 100644 --- a/src/test/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormatTest.java +++ b/src/test/java/io/cdap/plugin/gcp/bigquery/source/PartitionedBigQueryInputFormatTest.java @@ -34,13 +34,15 @@ @RunWith(MockitoJUnitRunner.class) public class PartitionedBigQueryInputFormatTest { + private static final String TEST_PROJECT = "test-project"; private static final String TEST_DATASET = "test-dataset"; private static final String TEST_TABLE = "test-table"; private static final String TEST_FILTER = "age > 10"; private static final String TEST_LIMIT = "100"; private static final String TEST_ORDER_BY = "name asc"; - private static final String TEST_TABLE_SPEC = String.format("%s.%s.%s", TEST_PROJECT, TEST_DATASET, TEST_TABLE); + private static final String TEST_TABLE_SPEC = String.format("%s.%s.%s", TEST_PROJECT, + TEST_DATASET, TEST_TABLE); private static final String TEST_FROM_DATE = "2025-01-01"; private static final String TEST_TO_DATE = "2025-01-02"; private static final String TEST_PARTITION_CONDITION = @@ -124,17 +126,6 @@ public void testGenerateQuery_WithFilterOnly() { Assert.assertEquals(expectedQuery, generatedQuery); } - @Test - public void testGenerateQuery_NoOptions() { - String expectedQuery = String.format("select * from %s", TEST_TABLE_SPEC); - - String generatedQuery = format.generateQuery(null, null, - null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, - null, null, - false, mockTableDefinition); - Assert.assertEquals(expectedQuery, generatedQuery); - } - @Test public void testGenerateQuery_AllOptions() { String expectedQuery = String.format("select * from %s where %s order by %s limit %s", @@ -163,38 +154,6 @@ public void testGenerateQuery_TimePartitionWithDates() { Assert.assertEquals(expectedQuery, generatedQuery); } - - @Test - public void testGenerateQuery_TimePartitionRequiredNoDates() { - when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); - when(mockTimePartitioning.getField()).thenReturn(null); - - String expectedQuery = String.format("select * from %s where %s", - TEST_TABLE_SPEC, TEST_DEFAULT_TIME_CONDITION); - - String generatedQuery = format.generateQuery(null, null, - null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, - null, null, - true, mockTableDefinition); - Assert.assertEquals(expectedQuery, generatedQuery); - } - - @Test - public void testGenerateQuery_RangePartitionRequiredNoDates() { - when(mockTableDefinition.getTimePartitioning()).thenReturn(null); - when(mockTableDefinition.getRangePartitioning()).thenReturn(mockRangePartitioning); - when(mockRangePartitioning.getField()).thenReturn("range_col"); - - String expectedQuery = String.format("select * from %s where %s", - TEST_TABLE_SPEC, TEST_DEFAULT_RANGE_CONDITION); - - String generatedQuery = format.generateQuery(null, null, null, - TEST_PROJECT, TEST_DATASET, TEST_TABLE, - null, null, - true, mockTableDefinition); - Assert.assertEquals(expectedQuery, generatedQuery); - } - @Test public void testGenerateQuery_TimePartitionRequiredAndFilter() { when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); @@ -229,22 +188,56 @@ public void testGenerateQuery_TimeUnitPartitionWithDates() { } @Test - public void testGenerateQuery_TimeUnitPartitionRequiredNoDates() { + public void testGenerateQuery_TimePartitionFilterNotRequiredWithDates() { when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); - when(mockTimePartitioning.getField()).thenReturn(TEST_TIME_UNIT_COL); + when(mockTimePartitioning.getField()).thenReturn(null); - String expectedQuery = String.format("select * from %s where %s", - TEST_TABLE_SPEC, TEST_DEFAULT_TIME_UNIT_CONDITION); + String expectedQuery = String.format("select * from %s where (%s)", + TEST_TABLE_SPEC, + TEST_PARTITION_CONDITION); - String generatedQuery = format.generateQuery(null, null, null, + String generatedQuery = format.generateQuery(TEST_FROM_DATE, TEST_TO_DATE, null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, null, null, - true, mockTableDefinition); + false, mockTableDefinition); Assert.assertEquals(expectedQuery, generatedQuery); } @Test - public void testGenerateQuery_TimePartitionFilterNotRequiredWithDates() { + public void testGenerateQuery_NoOptions_ShouldReturnNull() { + String generatedQuery = format.generateQuery(null, null, + null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, + null, null, + false, mockTableDefinition); + Assert.assertNull("Query should be null if no filters or options are set.", generatedQuery); + } + + @Test + public void testGenerateQuery_WithLimitOnly_ShouldAssertQuery() { + String expectedQuery = String.format("select * from %s limit %s", TEST_TABLE_SPEC, + TEST_LIMIT); + + String generatedQuery = format.generateQuery(null, null, + null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, + TEST_LIMIT, null, + false, mockTableDefinition); + Assert.assertEquals(expectedQuery, generatedQuery); + } + + @Test + public void testGenerateQuery_WithOrderByOnly_ShouldAssertQuery() { + String expectedQuery = String.format("select * from %s order by %s", TEST_TABLE_SPEC, + TEST_ORDER_BY); + + String generatedQuery = format.generateQuery(null, null, + null, TEST_PROJECT, TEST_DATASET, TEST_TABLE, + null, TEST_ORDER_BY, + false, mockTableDefinition); + Assert.assertEquals(expectedQuery, generatedQuery); + } + + @Test + public void testGenerateQuery_TimePartitionNotRequired_WithDates_ShouldAssertQuery() { when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); when(mockTimePartitioning.getField()).thenReturn(null); @@ -260,27 +253,77 @@ public void testGenerateQuery_TimePartitionFilterNotRequiredWithDates() { } @Test - public void testGenerateQuery_TimePartitionFilterNotRequiredNoDates() { + public void testGenerateQuery_TimePartitionRequired_WithFilterOnly_ShouldAssertQuery() { when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); + when(mockTimePartitioning.getField()).thenReturn(null); - String expectedQuery = String.format("select * from %s", TEST_TABLE_SPEC); - String generatedQuery = format.generateQuery(null, null, null, + String expectedQuery = String.format("select * from %s where %s and (%s)", + TEST_TABLE_SPEC, TEST_DEFAULT_TIME_CONDITION, TEST_FILTER); + + String generatedQuery = format.generateQuery(null, null, + TEST_FILTER, TEST_PROJECT, TEST_DATASET, TEST_TABLE, + null, null, + true, mockTableDefinition); + Assert.assertEquals(expectedQuery, generatedQuery); + } + + @Test + public void testGenerateQuery_RangePartitionRequiredAndFilter() { + when(mockTableDefinition.getRangePartitioning()).thenReturn(mockRangePartitioning); + when(mockRangePartitioning.getField()).thenReturn("range_col"); + + String expectedQuery = String.format("select * from %s where %s and (%s)", + TEST_TABLE_SPEC, TEST_DEFAULT_RANGE_CONDITION, TEST_FILTER); + + String generatedQuery = format.generateQuery(null, null, TEST_FILTER, TEST_PROJECT, TEST_DATASET, TEST_TABLE, null, null, - false, mockTableDefinition); + true, mockTableDefinition); Assert.assertEquals(expectedQuery, generatedQuery); } @Test - public void testGenerateQuery_RangePartitionFilterNotRequired() { + public void testGenerateQuery_RangePartitionRequiredWithLimit() { when(mockTableDefinition.getRangePartitioning()).thenReturn(mockRangePartitioning); + when(mockRangePartitioning.getField()).thenReturn("range_col"); - String expectedQuery = String.format("select * from %s", TEST_TABLE_SPEC); + String expectedQuery = String.format("select * from %s where %s limit %s", + TEST_TABLE_SPEC, TEST_DEFAULT_RANGE_CONDITION, TEST_LIMIT); String generatedQuery = format.generateQuery(null, null, null, + TEST_PROJECT, TEST_DATASET, TEST_TABLE, + TEST_LIMIT, null, + true, mockTableDefinition); + Assert.assertEquals(expectedQuery, generatedQuery); + } + + @Test + public void testGenerateQuery_TimeUnitPartitionRequiredAndFilter() { + when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); + when(mockTimePartitioning.getField()).thenReturn(TEST_TIME_UNIT_COL); + + String expectedQuery = String.format("select * from %s where %s and (%s)", + TEST_TABLE_SPEC, TEST_DEFAULT_TIME_UNIT_CONDITION, TEST_FILTER); + + String generatedQuery = format.generateQuery(null, null, TEST_FILTER, TEST_PROJECT, TEST_DATASET, TEST_TABLE, null, null, - false, mockTableDefinition); + true, mockTableDefinition); + Assert.assertEquals(expectedQuery, generatedQuery); + } + + @Test + public void testGenerateQuery_TimeUnitPartitionRequiredWithLimit() { + when(mockTableDefinition.getTimePartitioning()).thenReturn(mockTimePartitioning); + when(mockTimePartitioning.getField()).thenReturn(TEST_TIME_UNIT_COL); + + String expectedQuery = String.format("select * from %s where %s limit %s", + TEST_TABLE_SPEC, TEST_DEFAULT_TIME_UNIT_CONDITION, TEST_LIMIT); + + String generatedQuery = format.generateQuery(null, null, null, + TEST_PROJECT, TEST_DATASET, TEST_TABLE, + TEST_LIMIT, null, + true, mockTableDefinition); Assert.assertEquals(expectedQuery, generatedQuery); } }