lsyldliu commented on code in PR #25108:
URL: https://github.com/apache/flink/pull/25108#discussion_r1685926056


##########
flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/service/materializedtable/MaterializedTableManagerTest.java:
##########
@@ -99,56 +103,340 @@ void testGenerateInsertStatementWithDynamicOptions() {
         assertThat(actualStatement).isEqualTo(expectedStatement);
     }
 
-    @Test
-    void testGetPeriodRefreshPartition() {
-        String schedulerTime = "2024-01-01 00:00:00";
-        Map<String, String> tableOptions = new HashMap<>();
-        tableOptions.put("partition.fields.day.date-formatter", "yyyy-MM-dd");
-        tableOptions.put("partition.fields.hour.date-formatter", "HH");
-
+    @ParameterizedTest(name = "{index}: {0}")
+    @MethodSource("testData")
+    void testGetPeriodRefreshPartition(TestSpec testSpec) {
         ObjectIdentifier objectIdentifier = ObjectIdentifier.of("catalog", 
"database", "table");
 
-        Map<String, String> actualRefreshPartition =
-                MaterializedTableManager.getPeriodRefreshPartition(
-                        schedulerTime, objectIdentifier, tableOptions, 
ZoneId.systemDefault());
-        Map<String, String> expectedRefreshPartition = new HashMap<>();
-        expectedRefreshPartition.put("day", "2024-01-01");
-        expectedRefreshPartition.put("hour", "00");
+        if (testSpec.errorMessage == null) {
+            Map<String, String> actualRefreshPartition =
+                    MaterializedTableManager.getPeriodRefreshPartition(
+                            testSpec.schedulerTime,
+                            testSpec.freshness,
+                            objectIdentifier,
+                            testSpec.tableOptions,
+                            ZoneId.systemDefault());
 
-        assertThat(actualRefreshPartition).isEqualTo(expectedRefreshPartition);
+            
assertThat(actualRefreshPartition).isEqualTo(testSpec.expectedRefreshPartition);
+        } else {
+            assertThatThrownBy(
+                            () ->
+                                    
MaterializedTableManager.getPeriodRefreshPartition(
+                                            testSpec.schedulerTime,
+                                            testSpec.freshness,
+                                            objectIdentifier,
+                                            testSpec.tableOptions,
+                                            ZoneId.systemDefault()))
+                    .hasMessage(testSpec.errorMessage);
+        }
     }
 
-    @Test
-    void testGetPeriodRefreshPartitionWithInvalidSchedulerTime() {
-        // scheduler time is null
-        Map<String, String> tableOptions = new HashMap<>();
-        tableOptions.put("partition.fields.day.date-formatter", "yyyy-MM-dd");
-        tableOptions.put("partition.fields.hour.date-formatter", "HH");
+    static Stream<TestSpec> testData() {
+        return Stream.of(
+                // The interval of freshness match the partition specified by 
the 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2024-01-01")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 01:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2024-01-02")
+                        .expectedRefreshPartition("hour", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "22"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "20"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("8"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "16"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("12"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "12"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "59"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "58"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "56"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("5"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "55"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("6"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "54"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("10"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "50"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("12"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "48"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("15"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "45"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("30"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "30"),
 
-        ObjectIdentifier objectIdentifier = ObjectIdentifier.of("catalog", 
"database", "table");
+                // The interval of freshness is larger than the partition 
specified by the
+                // 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "00")
+                        .expectedRefreshPartition("minute", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "00"),
+                // The interval of freshness is less than the partition 
specified by the
+                // 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 01:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 02:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 04:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("15"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:01:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+
+                // Invalid test case.
+                TestSpec.create()
+                        .schedulerTime(null)
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .errorMessage(
+                                "Scheduler time not properly set for periodic 
refresh of materialized table `catalog`.`database`.`table`."),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .errorMessage(
+                                "Failed to parse a valid partition value for 
the field 'day' in materialized table `catalog`.`database`.`table` using the 
scheduler time '2024-01-01' based on the date format 'yyyy-MM-dd HH:mm:ss'."));
+    }
+
+    private static class TestSpec {
+        private String schedulerTime;
+        private IntervalFreshness freshness;
+        private Map<String, String> tableOptions;

Review Comment:
   final



##########
flink-table/flink-sql-gateway/src/test/java/org/apache/flink/table/gateway/service/materializedtable/MaterializedTableManagerTest.java:
##########
@@ -99,56 +103,340 @@ void testGenerateInsertStatementWithDynamicOptions() {
         assertThat(actualStatement).isEqualTo(expectedStatement);
     }
 
-    @Test
-    void testGetPeriodRefreshPartition() {
-        String schedulerTime = "2024-01-01 00:00:00";
-        Map<String, String> tableOptions = new HashMap<>();
-        tableOptions.put("partition.fields.day.date-formatter", "yyyy-MM-dd");
-        tableOptions.put("partition.fields.hour.date-formatter", "HH");
-
+    @ParameterizedTest(name = "{index}: {0}")
+    @MethodSource("testData")
+    void testGetPeriodRefreshPartition(TestSpec testSpec) {
         ObjectIdentifier objectIdentifier = ObjectIdentifier.of("catalog", 
"database", "table");
 
-        Map<String, String> actualRefreshPartition =
-                MaterializedTableManager.getPeriodRefreshPartition(
-                        schedulerTime, objectIdentifier, tableOptions, 
ZoneId.systemDefault());
-        Map<String, String> expectedRefreshPartition = new HashMap<>();
-        expectedRefreshPartition.put("day", "2024-01-01");
-        expectedRefreshPartition.put("hour", "00");
+        if (testSpec.errorMessage == null) {
+            Map<String, String> actualRefreshPartition =
+                    MaterializedTableManager.getPeriodRefreshPartition(
+                            testSpec.schedulerTime,
+                            testSpec.freshness,
+                            objectIdentifier,
+                            testSpec.tableOptions,
+                            ZoneId.systemDefault());
 
-        assertThat(actualRefreshPartition).isEqualTo(expectedRefreshPartition);
+            
assertThat(actualRefreshPartition).isEqualTo(testSpec.expectedRefreshPartition);
+        } else {
+            assertThatThrownBy(
+                            () ->
+                                    
MaterializedTableManager.getPeriodRefreshPartition(
+                                            testSpec.schedulerTime,
+                                            testSpec.freshness,
+                                            objectIdentifier,
+                                            testSpec.tableOptions,
+                                            ZoneId.systemDefault()))
+                    .hasMessage(testSpec.errorMessage);
+        }
     }
 
-    @Test
-    void testGetPeriodRefreshPartitionWithInvalidSchedulerTime() {
-        // scheduler time is null
-        Map<String, String> tableOptions = new HashMap<>();
-        tableOptions.put("partition.fields.day.date-formatter", "yyyy-MM-dd");
-        tableOptions.put("partition.fields.hour.date-formatter", "HH");
+    static Stream<TestSpec> testData() {
+        return Stream.of(
+                // The interval of freshness match the partition specified by 
the 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2024-01-01")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-02 01:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2024-01-02")
+                        .expectedRefreshPartition("hour", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "22"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "20"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("8"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "16"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("12"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "12"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "59"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "58"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "56"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("5"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "55"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("6"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "54"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("10"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "50"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("12"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "48"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("15"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "45"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("30"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "30"),
 
-        ObjectIdentifier objectIdentifier = ObjectIdentifier.of("catalog", 
"database", "table");
+                // The interval of freshness is larger than the partition 
specified by the
+                // 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "00")
+                        .expectedRefreshPartition("minute", "00"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        
.tableOptions("partition.fields.minute.date-formatter", "mm")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23")
+                        .expectedRefreshPartition("minute", "00"),
+                // The interval of freshness is less than the partition 
specified by the
+                // 'date-formatter'.
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 01:00:00")
+                        .freshness(IntervalFreshness.ofHour("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 02:00:00")
+                        .freshness(IntervalFreshness.ofHour("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 04:00:00")
+                        .freshness(IntervalFreshness.ofHour("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("2"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("4"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("15"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .expectedRefreshPartition("day", "2023-12-31")
+                        .expectedRefreshPartition("hour", "23"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:00:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2023-12-31"),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01 00:01:00")
+                        .freshness(IntervalFreshness.ofMinute("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .expectedRefreshPartition("day", "2024-01-01"),
+
+                // Invalid test case.
+                TestSpec.create()
+                        .schedulerTime(null)
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .errorMessage(
+                                "Scheduler time not properly set for periodic 
refresh of materialized table `catalog`.`database`.`table`."),
+                TestSpec.create()
+                        .schedulerTime("2024-01-01")
+                        .freshness(IntervalFreshness.ofDay("1"))
+                        .tableOptions("partition.fields.day.date-formatter", 
"yyyy-MM-dd")
+                        .tableOptions("partition.fields.hour.date-formatter", 
"HH")
+                        .errorMessage(
+                                "Failed to parse a valid partition value for 
the field 'day' in materialized table `catalog`.`database`.`table` using the 
scheduler time '2024-01-01' based on the date format 'yyyy-MM-dd HH:mm:ss'."));
+    }
+
+    private static class TestSpec {
+        private String schedulerTime;
+        private IntervalFreshness freshness;
+        private Map<String, String> tableOptions;
+        private Map<String, String> expectedRefreshPartition;

Review Comment:
   final



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@flink.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to