This is an automated email from the ASF dual-hosted git repository.

gosonzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b2d634  [INLONG-677] Support dt as built-in data time partition field 
in inlong-sort (#519)
9b2d634 is described below

commit 9b2d634c5a5b67b8e5205d7ab3fbbcea294166b2
Author: chantccc <[email protected]>
AuthorDate: Wed Jul 7 19:09:11 2021 +0800

    [INLONG-677] Support dt as built-in data time partition field in 
inlong-sort (#519)
    
    Co-authored-by: leobiaoliu <[email protected]>
---
 .../inlong/sort/configuration/Constants.java       |  5 ++++
 .../transformation/FieldMappingTransformer.java    | 12 +++++++---
 .../FieldMappingTransformerTest.java               | 27 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git 
a/inlong-sort/common/src/main/java/org/apache/inlong/sort/configuration/Constants.java
 
b/inlong-sort/common/src/main/java/org/apache/inlong/sort/configuration/Constants.java
index dfc077a..4c6c67e 100644
--- 
a/inlong-sort/common/src/main/java/org/apache/inlong/sort/configuration/Constants.java
+++ 
b/inlong-sort/common/src/main/java/org/apache/inlong/sort/configuration/Constants.java
@@ -41,6 +41,11 @@ public class Constants {
 
     public static final String SINK_UID = "sink_uid";
 
+    /**
+     * It uses dt as the built-in data time field name. It's a work-around 
solution and should be replaced by later.
+     */
+    public static final String DATA_TIME_FIELD = "dt";
+
     // ------------------------------------------------------------------------
     //  Common configs
     // ------------------------------------------------------------------------
diff --git 
a/inlong-sort/core/src/main/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformer.java
 
b/inlong-sort/core/src/main/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformer.java
index 1f5f2ff..e4485c2 100644
--- 
a/inlong-sort/core/src/main/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformer.java
+++ 
b/inlong-sort/core/src/main/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformer.java
@@ -27,6 +27,8 @@ import org.apache.inlong.sort.protocol.FieldInfo;
 import org.apache.inlong.sort.protocol.sink.SinkInfo;
 import org.apache.inlong.sort.protocol.source.SourceInfo;
 
+import static org.apache.inlong.sort.configuration.Constants.DATA_TIME_FIELD;
+
 /**
  * TODO, replace it with operator when it supports complex transformation.
  */
@@ -88,6 +90,7 @@ public class FieldMappingTransformer implements 
DataFlowInfoListener {
             for (int i = 0; i < sourceInfo.getFields().length; i++) {
                 final FieldInfo fieldInfo = sourceInfo.getFields()[i];
                 // use name to map field from source and sink
+                // skip time and attributes fields
                 sourceFieldIndices.put(fieldInfo.getName(), i + 
SOURCE_FIELD_SKIP_STEP);
             }
             final SinkInfo sinkInfo = dataFlowInfo.getSinkInfo();
@@ -95,10 +98,13 @@ public class FieldMappingTransformer implements 
DataFlowInfoListener {
             for (int i = 0; i < sinkInfo.getFields().length; i++) {
                 final FieldInfo fieldInfo = sinkInfo.getFields()[i];
                 final Integer fieldIndex = 
sourceFieldIndices.get(fieldInfo.getName());
-                if (fieldIndex == null) {
-                    indices[i] = -1;
-                } else {
+                if (fieldIndex != null) {
                     indices[i] = fieldIndex;
+                } else if (DATA_TIME_FIELD.equals(fieldInfo.getName())) {
+                    // built-in data time field
+                    indices[i] = 0;
+                } else {
+                    indices[i] = -1;
                 }
             }
         }
diff --git 
a/inlong-sort/core/src/test/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformerTest.java
 
b/inlong-sort/core/src/test/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformerTest.java
index ad76ac6..43aab2d 100644
--- 
a/inlong-sort/core/src/test/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformerTest.java
+++ 
b/inlong-sort/core/src/test/java/org/apache/inlong/sort/flink/transformation/FieldMappingTransformerTest.java
@@ -24,6 +24,7 @@ import org.apache.flink.types.Row;
 import org.apache.inlong.sort.flink.Record;
 import org.apache.inlong.sort.formats.common.LongFormatInfo;
 import org.apache.inlong.sort.formats.common.StringFormatInfo;
+import org.apache.inlong.sort.formats.common.TimestampFormatInfo;
 import org.apache.inlong.sort.protocol.DataFlowInfo;
 import org.apache.inlong.sort.protocol.FieldInfo;
 import org.apache.inlong.sort.protocol.sink.SinkInfo;
@@ -61,4 +62,30 @@ public class FieldMappingTransformerTest extends TestLogger {
         assertEquals(1, sinkRecord.getRow().getArity());
         assertEquals(9527L, sinkRecord.getRow().getField(0));
     }
+
+    @Test
+    public void testTransformWithDt() throws Exception {
+        final FieldInfo fieldInfo = new FieldInfo("id", new LongFormatInfo());
+        final FieldInfo dtFieldInfo = new FieldInfo("dt", new 
TimestampFormatInfo("MILLIS"));
+
+        final SourceInfo sourceInfo = new TestingSourceInfo(new 
FieldInfo[]{fieldInfo});
+        final SinkInfo sinkInfo = new TestingSinkInfo(new 
FieldInfo[]{fieldInfo, dtFieldInfo});
+        final long dataFlowId = 1L;
+        final DataFlowInfo dataFlowInfo = new DataFlowInfo(dataFlowId, 
sourceInfo, sinkInfo);
+
+        final FieldMappingTransformer transformer = new 
FieldMappingTransformer();
+        transformer.addDataFlow(dataFlowInfo);
+        // should be 3 fields (1 origin fields + time + attr)
+        final Row sourceRow = new Row(1 + SOURCE_FIELD_SKIP_STEP);
+        final long dt = System.currentTimeMillis();
+        sourceRow.setField(0, dt);
+        sourceRow.setField(1, "attr");
+        sourceRow.setField(2, 9527L);
+        final Record sourceRecord = new Record(dataFlowId, sourceRow);
+        final Record sinkRecord = transformer.transform(sourceRecord);
+        assertEquals(dataFlowId, sinkRecord.getDataflowId());
+        assertEquals(2, sinkRecord.getRow().getArity());
+        assertEquals(9527L, sinkRecord.getRow().getField(0));
+        assertEquals(dt, sinkRecord.getRow().getField(1));
+    }
 }
\ No newline at end of file

Reply via email to