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

lqc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new da897dddaf Implement the ability to toggle dropping CLP processed 
field from the original generic record. (#14534)
da897dddaf is described below

commit da897dddaf9d184fbc1051177615208b2aec8f97
Author: Jack Luo <[email protected]>
AuthorDate: Thu Nov 28 05:23:59 2024 +0800

    Implement the ability to toggle dropping CLP processed field from the 
original generic record. (#14534)
    
    * Implement the ability to toggle dropping CLP processed field from the 
original generic record.
    
    * Fix unit test
---
 .../inputformat/clplog/CLPLogRecordExtractor.java  |  4 +++
 .../clplog/CLPLogRecordExtractorConfig.java        |  9 ++++++
 .../clplog/CLPLogRecordExtractorTest.java          | 32 +++++++++++++++-------
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractor.java
 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractor.java
index f785a5bcce..eb52df9971 100644
--- 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractor.java
+++ 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractor.java
@@ -253,5 +253,9 @@ public class CLPLogRecordExtractor extends 
BaseRecordExtractor<Map<String, Objec
     to.putValue(key + ClpRewriter.LOGTYPE_COLUMN_SUFFIX, logtype);
     to.putValue(key + ClpRewriter.DICTIONARY_VARS_COLUMN_SUFFIX, dictVars);
     to.putValue(key + ClpRewriter.ENCODED_VARS_COLUMN_SUFFIX, encodedVars);
+
+    if (!_config.getRemoveProcessedFields()) {
+      to.putValue(key, value);
+    }
   }
 }
diff --git 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorConfig.java
 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorConfig.java
index 87d5b8efe6..3d08f42da5 100644
--- 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorConfig.java
+++ 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/main/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorConfig.java
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
 public class CLPLogRecordExtractorConfig implements RecordExtractorConfig {
   public static final String FIELDS_FOR_CLP_ENCODING_CONFIG_KEY = 
"fieldsForClpEncoding";
   public static final String FIELDS_FOR_CLP_ENCODING_SEPARATOR = ",";
+  public static final String REMOVE_PROCESSED_FIELDS_CONFIG_KEY = 
"removeProcessedFields";
   public static final String UNENCODABLE_FIELD_SUFFIX_CONFIG_KEY = 
"unencodableFieldSuffix";
   public static final String UNENCODABLE_FIELD_ERROR_CONFIG_KEY = 
"unencodableFieldError";
 
@@ -54,6 +55,7 @@ public class CLPLogRecordExtractorConfig implements 
RecordExtractorConfig {
   private final Set<String> _fieldsForClpEncoding = new HashSet<>();
   private String _unencodableFieldSuffix = null;
   private String _unencodableFieldError = null;
+  private boolean _removeProcessedFields = false;
 
   @Override
   public void init(Map<String, String> props) {
@@ -75,6 +77,9 @@ public class CLPLogRecordExtractorConfig implements 
RecordExtractorConfig {
       }
     }
 
+    // True if field is specified and equal to true (ignore case), false for 
all other cases
+    _removeProcessedFields = 
Boolean.parseBoolean(props.get(REMOVE_PROCESSED_FIELDS_CONFIG_KEY));
+
     String unencodableFieldSuffix = 
props.get(UNENCODABLE_FIELD_SUFFIX_CONFIG_KEY);
     if (null != unencodableFieldSuffix) {
       if (unencodableFieldSuffix.length() == 0) {
@@ -98,6 +103,10 @@ public class CLPLogRecordExtractorConfig implements 
RecordExtractorConfig {
     return _fieldsForClpEncoding;
   }
 
+  public boolean getRemoveProcessedFields() {
+    return _removeProcessedFields;
+  }
+
   public String getUnencodableFieldSuffix() {
     return _unencodableFieldSuffix;
   }
diff --git 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/test/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorTest.java
 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/test/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorTest.java
index 0ad198fe18..2e002cdb0c 100644
--- 
a/pinot-plugins/pinot-input-format/pinot-clp-log/src/test/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorTest.java
+++ 
b/pinot-plugins/pinot-input-format/pinot-clp-log/src/test/java/org/apache/pinot/plugin/inputformat/clplog/CLPLogRecordExtractorTest.java
@@ -32,6 +32,7 @@ import org.testng.annotations.Test;
 
 import static 
org.apache.pinot.plugin.inputformat.clplog.CLPLogRecordExtractorConfig.FIELDS_FOR_CLP_ENCODING_CONFIG_KEY;
 import static 
org.apache.pinot.plugin.inputformat.clplog.CLPLogRecordExtractorConfig.FIELDS_FOR_CLP_ENCODING_SEPARATOR;
+import static 
org.apache.pinot.plugin.inputformat.clplog.CLPLogRecordExtractorConfig.REMOVE_PROCESSED_FIELDS_CONFIG_KEY;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNull;
@@ -54,11 +55,17 @@ public class CLPLogRecordExtractorTest {
 
   @Test
   public void testCLPEncoding() {
+    testCLPEncoding(true);
+    testCLPEncoding(false);
+  }
+
+  public void testCLPEncoding(boolean removeProcessedField) {
     Map<String, String> props = new HashMap<>();
     Set<String> fieldsToRead = new HashSet<>();
     // Add some fields for CLP encoding
     props.put(FIELDS_FOR_CLP_ENCODING_CONFIG_KEY,
         _MESSAGE_1_FIELD_NAME + FIELDS_FOR_CLP_ENCODING_SEPARATOR + 
_MESSAGE_2_FIELD_NAME);
+    props.put(REMOVE_PROCESSED_FIELDS_CONFIG_KEY, 
String.valueOf(removeProcessedField));
     addCLPEncodedField(_MESSAGE_1_FIELD_NAME, fieldsToRead);
     addCLPEncodedField(_MESSAGE_2_FIELD_NAME, fieldsToRead);
     // Add some unencoded fields
@@ -70,25 +77,27 @@ public class CLPLogRecordExtractorTest {
     row = extract(props, fieldsToRead);
     assertEquals(row.getValue(_TIMESTAMP_FIELD_NAME), _TIMESTAMP_FIELD_VALUE);
     assertNull(row.getValue(_LEVEL_FIELD_NAME));
-    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE);
+    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE, removeProcessedField);
+    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE, removeProcessedField);
 
     // Test extracting all fields
     row = extract(props, null);
     assertEquals(row.getValue(_TIMESTAMP_FIELD_NAME), _TIMESTAMP_FIELD_VALUE);
     assertEquals(row.getValue(_LEVEL_FIELD_NAME), _LEVEL_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE);
+    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE, removeProcessedField);
+    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE, removeProcessedField);
   }
 
   @Test
   public void testBadCLPEncodingConfig() {
     Map<String, String> props = new HashMap<>();
     Set<String> fieldsToRead = new HashSet<>();
+    boolean removeProcessedField = true;
     // Add some fields for CLP encoding with some mistakenly empty field names
     String separator = FIELDS_FOR_CLP_ENCODING_SEPARATOR;
     props.put(FIELDS_FOR_CLP_ENCODING_CONFIG_KEY, separator + 
_MESSAGE_1_FIELD_NAME
         + separator + separator + _MESSAGE_2_FIELD_NAME + separator);
+    props.put(REMOVE_PROCESSED_FIELDS_CONFIG_KEY, 
String.valueOf(removeProcessedField));
     addCLPEncodedField(_MESSAGE_1_FIELD_NAME, fieldsToRead);
     addCLPEncodedField(_MESSAGE_2_FIELD_NAME, fieldsToRead);
     // Add some unencoded fields
@@ -100,16 +109,16 @@ public class CLPLogRecordExtractorTest {
     row = extract(props, fieldsToRead);
     assertEquals(row.getValue(_TIMESTAMP_FIELD_NAME), _TIMESTAMP_FIELD_VALUE);
     assertNull(row.getValue(_LEVEL_FIELD_NAME));
-    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE);
+    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE, removeProcessedField);
+    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE, removeProcessedField);
 
     // Test extracting all fields
     row = extract(props, null);
     assertEquals(row.getValue(_TIMESTAMP_FIELD_NAME), _TIMESTAMP_FIELD_VALUE);
     assertEquals(row.getValue(_LEVEL_FIELD_NAME), _LEVEL_FIELD_VALUE);
     assertEquals(row.getValue(_BOOLEAN_FIELD_NAME), _BOOLEAN_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE);
-    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE);
+    validateClpEncodedField(row, _MESSAGE_1_FIELD_NAME, 
_MESSAGE_1_FIELD_VALUE, removeProcessedField);
+    validateClpEncodedField(row, _MESSAGE_2_FIELD_NAME, 
_MESSAGE_2_FIELD_VALUE, removeProcessedField);
   }
 
   @Test
@@ -163,10 +172,13 @@ public class CLPLogRecordExtractorTest {
     return row;
   }
 
-  private void validateClpEncodedField(GenericRow row, String fieldName, 
String expectedFieldValue) {
+  private void validateClpEncodedField(GenericRow row, String fieldName, 
String expectedFieldValue,
+      boolean removeProcessedField) {
     try {
       // Decode and validate field
-      assertNull(row.getValue(fieldName));
+      if (removeProcessedField) {
+        assertNull(row.getValue(fieldName));
+      }
       String logtype = (String) row.getValue(fieldName + 
ClpRewriter.LOGTYPE_COLUMN_SUFFIX);
       assertNotEquals(logtype, null);
       String[] dictionaryVars =


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to