[
https://issues.apache.org/jira/browse/GOBBLIN-2159?focusedWorklogId=936298&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-936298
]
ASF GitHub Bot logged work on GOBBLIN-2159:
-------------------------------------------
Author: ASF GitHub Bot
Created on: 25/Sep/24 05:43
Start Date: 25/Sep/24 05:43
Worklog Time Spent: 10m
Work Description: Blazer-007 commented on code in PR #4058:
URL: https://github.com/apache/gobblin/pull/4058#discussion_r1774534733
##########
gobblin-data-management/src/test/java/org/apache/gobblin/data/management/copy/iceberg/predicates/IcebergPartitionFilterPredicateTest.java:
##########
@@ -0,0 +1,198 @@
+/*
+ * 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 org.apache.gobblin.data.management.copy.iceberg.predicates;
+
+import java.util.Properties;
+
+import org.apache.iceberg.StructLike;
+import org.apache.iceberg.TableMetadata;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/** Tests for {@link
org.apache.gobblin.data.management.copy.iceberg.predicates.IcebergPartitionFilterPredicate}
*/
+public class IcebergPartitionFilterPredicateTest {
+
+ private TableMetadata mockTableMetadata;
+ private Properties mockProperties;
+ private MockedStatic<IcebergPartitionFilterPredicateUtil>
icebergPartitionFilterPredicateUtilMockedStatic;
+ private static final String TEST_ICEBERG_PARTITION_VALUES_KEY =
"iceberg.dataset.source.partition.values";
+ private static final String TEST_ICEBERG_PARTITION_VALUES_EXCEPTION_MESSAGE
= "Partition column values cannot be empty";
+ private static final String TEST_ICEBERG_PARTITION_COLUMN = "col1";
+ private static final String TEST_ICEBERG_PARTITION_VALUES = "value1,value2";
+ private static final String TEST_ICEBERG_PARTITION_VALUES_2 =
"value1,value3,value2,value4";
+ private static final String TEST_ICEBERG_PARTITION_VALUES_3 = "1,2,3,4";
+
+ @BeforeMethod
+ public void setup() {
+ mockTableMetadata = Mockito.mock(TableMetadata.class);
+ mockProperties = new Properties();
+ icebergPartitionFilterPredicateUtilMockedStatic =
Mockito.mockStatic(IcebergPartitionFilterPredicateUtil.class);
+ icebergPartitionFilterPredicateUtilMockedStatic.when(
+ () ->
IcebergPartitionFilterPredicateUtil.getPartitionColumnIndex(Mockito.anyString(),
Mockito.any(TableMetadata.class), Mockito.anyList()))
+ .thenReturn(0);
+ }
+
+ @AfterMethod
+ public void cleanup() {
+ icebergPartitionFilterPredicateUtilMockedStatic.close();
+ }
+
+ @Test
+ public void testPartitionColumnNotFound() {
+ icebergPartitionFilterPredicateUtilMockedStatic.when(
+ () ->
IcebergPartitionFilterPredicateUtil.getPartitionColumnIndex(Mockito.anyString(),
Mockito.any(TableMetadata.class), Mockito.anyList()))
+ .thenReturn(-1);
+ IllegalArgumentException exception =
Assert.expectThrows(IllegalArgumentException.class, () -> {
+ new IcebergPartitionFilterPredicate("nonexistentColumn",
mockTableMetadata, mockProperties);
+ });
+ Assert.assertEquals(exception.getMessage(), "Partition column
nonexistentColumn not found");
+ }
+
+ @Test
+ public void testPartitionColumnValuesEmpty() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY, "");
+ verifyIllegalArgumentExceptionWithMessage();
+ }
+
+ @Test
+ public void testPartitionColumnValuesNULL() {
+ // Not setting values in mockProperties to test NULL value
+ verifyIllegalArgumentExceptionWithMessage();
+ }
+
+ @Test
+ public void testPartitionColumnValuesWhitespaces() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY, " ");
+ verifyIllegalArgumentExceptionWithMessage();
+ }
+
+ @Test
+ public void testPartitionValueNULL() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES);
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+ // Just mocking, so that the partition value is NULL
+ Assert.assertFalse(predicate.test(Mockito.mock(StructLike.class)));
+ }
+
+ @Test
+ public void testWhenPartitionIsNull() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES);
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+ Assert.assertFalse(predicate.test(null));
+ }
+
+ @Test
+ public void testPartitionValueMatch() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES);
+
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+
+ StructLike mockPartition = Mockito.mock(StructLike.class);
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn("value1");
+
+ Assert.assertTrue(predicate.test(mockPartition));
+ }
+
+ @Test
+ public void testPartitionValueMatch2() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES_2);
+
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+
+ StructLike mockPartition = Mockito.mock(StructLike.class);
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn("value2");
+
+ Assert.assertTrue(predicate.test(mockPartition));
+ }
+
+ @Test
+ public void testPartitionValueNoMatch() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES);
+
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+
+ StructLike mockPartition = Mockito.mock(StructLike.class);
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn("value3");
+
+ Assert.assertFalse(predicate.test(mockPartition));
+ }
+
+ @Test
+ public void testPartitionValuesAsInt() {
+ mockProperties.setProperty(TEST_ICEBERG_PARTITION_VALUES_KEY,
TEST_ICEBERG_PARTITION_VALUES_3);
+
+ IcebergPartitionFilterPredicate predicate = new
IcebergPartitionFilterPredicate(TEST_ICEBERG_PARTITION_COLUMN,
+ mockTableMetadata, mockProperties);
+
+ StructLike mockPartition = Mockito.mock(StructLike.class);
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn(3);
+ Assert.assertTrue(predicate.test(mockPartition));
+
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn(4);
+ Assert.assertTrue(predicate.test(mockPartition));
+
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn(10);
+ Assert.assertFalse(predicate.test(mockPartition));
+
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn(Integer.MAX_VALUE);
+ Assert.assertFalse(predicate.test(mockPartition));
+
+ Mockito.when(mockPartition.get(Mockito.anyInt(),
Mockito.eq(Object.class))).thenReturn(Integer.MIN_VALUE);
+ Assert.assertFalse(predicate.test(mockPartition));
+ }
+
+ @Test
+ public void testPartitionValuesAsIntMaxMin() {
Review Comment:
Just wanted to make sure .toString() returns correct while converting,
although we also can remove this test if it is not adding any value.
Issue Time Tracking
-------------------
Worklog Id: (was: 936298)
Time Spent: 2.5h (was: 2h 20m)
> Support Partition Based Copy in Iceberg Distcp
> ----------------------------------------------
>
> Key: GOBBLIN-2159
> URL: https://issues.apache.org/jira/browse/GOBBLIN-2159
> Project: Apache Gobblin
> Issue Type: Task
> Reporter: Vivek Rai
> Priority: Major
> Time Spent: 2.5h
> Remaining Estimate: 0h
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)