You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/04/29 19:13:28 UTC

[iotdb] branch master updated: [IOTDB-2993] Support IN, LIKE, and REGEXP expressions in Transform Operator (#5739)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5b045e4864 [IOTDB-2993] Support IN, LIKE, and REGEXP expressions in Transform Operator (#5739)
5b045e4864 is described below

commit 5b045e4864de7c08b1ff9b80adab7bdfeb54b504
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Sat Apr 30 03:13:23 2022 +0800

    [IOTDB-2993] Support IN, LIKE, and REGEXP expressions in Transform Operator (#5739)
---
 .../iotdb/db/integration/IoTDBNestedQueryIT.java   |  25 ++++
 .../expression/binary/AdditionExpression.java      |   4 +-
 .../query/expression/binary/BinaryExpression.java  |   2 +-
 .../expression/binary/DivisionExpression.java      |   4 +-
 .../query/expression/binary/EqualToExpression.java |   4 +-
 .../expression/binary/GreaterEqualExpression.java  |   4 +-
 .../expression/binary/GreaterThanExpression.java   |   4 +-
 .../expression/binary/LessEqualExpression.java     |   4 +-
 .../expression/binary/LessThanExpression.java      |   4 +-
 .../expression/binary/LogicAndExpression.java      |   4 +-
 .../query/expression/binary/LogicOrExpression.java |   4 +-
 .../query/expression/binary/ModuloExpression.java  |   4 +-
 .../binary/MultiplicationExpression.java           |   4 +-
 .../expression/binary/NonEqualExpression.java      |   4 +-
 .../expression/binary/SubtractionExpression.java   |   4 +-
 .../query/expression/multi/FunctionExpression.java |   8 +-
 .../db/query/expression/unary/LikeExpression.java  |  80 ++++++++++-
 .../query/expression/unary/LogicNotExpression.java |   2 +-
 .../query/expression/unary/NegationExpression.java |   2 +-
 .../query/expression/unary/RegularExpression.java  |   5 +-
 .../transformer/ArithmeticNegationTransformer.java |  80 -----------
 .../db/query/udf/core/transformer/Transformer.java |   2 +-
 .../core/transformer/TransparentTransformer.java   |  93 -------------
 .../ArithmeticAdditionTransformer.java             |   2 +-
 .../{ => binary}/ArithmeticBinaryTransformer.java  |   2 +-
 .../ArithmeticDivisionTransformer.java             |   2 +-
 .../{ => binary}/ArithmeticModuloTransformer.java  |   2 +-
 .../ArithmeticMultiplicationTransformer.java       |   2 +-
 .../ArithmeticSubtractionTransformer.java          |   2 +-
 .../{ => binary}/BinaryTransformer.java            |   3 +-
 .../{ => binary}/CompareBinaryTransformer.java     |   2 +-
 .../{ => binary}/CompareEqualToTransformer.java    |   2 +-
 .../CompareGreaterEqualTransformer.java            |   2 +-
 .../CompareGreaterThanTransformer.java             |   2 +-
 .../{ => binary}/CompareLessEqualTransformer.java  |   2 +-
 .../{ => binary}/CompareLessThanTransformer.java   |   2 +-
 .../{ => binary}/CompareNonEqualTransformer.java   |   2 +-
 .../{ => binary}/LogicAndTransformer.java          |   2 +-
 .../{ => binary}/LogicBinaryTransformer.java       |   2 +-
 .../{ => binary}/LogicOrTransformer.java           |   2 +-
 .../{ => multi}/UDFQueryRowTransformer.java        |   2 +-
 .../{ => multi}/UDFQueryRowWindowTransformer.java  |   2 +-
 .../{ => multi}/UDFQueryTransformer.java           |   3 +-
 .../ArithmeticNegationTransformer.java}            |  36 +++--
 .../udf/core/transformer/unary/InTransformer.java  | 149 +++++++++++++++++++++
 .../LogicNotTransformer.java}                      |  25 ++--
 .../RegularTransformer.java}                       |  35 +++--
 .../transformer/unary/TransparentTransformer.java  |  70 ++++++++++
 .../UnaryTransformer.java}                         |  34 ++---
 49 files changed, 458 insertions(+), 284 deletions(-)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNestedQueryIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNestedQueryIT.java
index 317f7dfd1e..dbf69fbe81 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNestedQueryIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNestedQueryIT.java
@@ -34,6 +34,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
@@ -584,4 +585,28 @@ public class IoTDBNestedQueryIT {
       Assert.fail(e.getMessage());
     }
   }
+
+  @Test
+  @Ignore
+  public void testRegularLikeInExpressions() {
+    try (Connection connection =
+            DriverManager.getConnection(
+                Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+        Statement statement = connection.createStatement()) {
+      String query =
+          "SELECT ((CAST(s1, 'type'='TEXT') LIKE '_') REGEXP '*') IN ('4', '2', '3') "
+              + "FROM root.vehicle.d1";
+      try (ResultSet rs = statement.executeQuery(query)) {
+        for (int i = 2; i <= 4; i++) {
+          Assert.assertTrue(rs.next());
+          Assert.assertEquals(i, rs.getLong(1));
+          Assert.assertEquals(i, rs.getLong(2));
+        }
+        Assert.assertFalse(rs.next());
+      }
+    } catch (SQLException e) {
+      e.printStackTrace();
+      Assert.fail(e.getMessage());
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
index a4ba44b3c7..6ec5ce8399 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/AdditionExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticAdditionTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticAdditionTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticBinaryTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
index c535d97faa..d4765287b8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/BinaryExpression.java
@@ -35,8 +35,8 @@ import org.apache.iotdb.db.query.udf.core.layer.RawQueryInputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputColumnMultiReferenceIntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.BinaryTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.BinaryTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
index b73e156a07..5ba106f459 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/DivisionExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticDivisionTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticDivisionTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
index 5edc7e8ae8..aa85becd07 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/EqualToExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareEqualToTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareEqualToTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
index 2e7594d403..0364212ac8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterEqualExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareGreaterEqualTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareGreaterEqualTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
index 14f2e4321d..56589b5e10 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/GreaterThanExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareGreaterThanTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareGreaterThanTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
index 0368c02290..599a05f67b 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessEqualExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareLessEqualTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareLessEqualTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
index 2a05a80c4a..1852771e8e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LessThanExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareLessThanTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareLessThanTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
index a7f905ad1f..35f19c258b 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicAndExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.LogicAndTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.LogicBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.LogicAndTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.LogicBinaryTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
index e0a7e1437d..ee0609ae16 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/LogicOrExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.LogicBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.LogicOrTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.LogicBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.LogicOrTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
index 44d7d01b02..e43f23f3c5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/ModuloExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticModuloTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticModuloTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
index 1a52b209c8..d5b15dc55d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/MultiplicationExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticMultiplicationTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticMultiplicationTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
index 3169ed1834..6c9337fa57 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/NonEqualExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.CompareNonEqualTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.CompareNonEqualTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
index b2a0fd6151..3e31ad9039 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/binary/SubtractionExpression.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.query.expression.binary;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticBinaryTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticSubtractionTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticBinaryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.binary.ArithmeticSubtractionTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/multi/FunctionExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/multi/FunctionExpression.java
index 972260083d..64dd38df40 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/multi/FunctionExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/multi/FunctionExpression.java
@@ -42,10 +42,10 @@ import org.apache.iotdb.db.query.udf.core.layer.RawQueryInputLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputColumnMultiReferenceIntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.layer.SingleInputColumnSingleReferenceIntermediateLayer;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
-import org.apache.iotdb.db.query.udf.core.transformer.TransparentTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.UDFQueryRowTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.UDFQueryRowWindowTransformer;
-import org.apache.iotdb.db.query.udf.core.transformer.UDFQueryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.multi.UDFQueryRowTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.multi.UDFQueryRowWindowTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.multi.UDFQueryTransformer;
+import org.apache.iotdb.db.query.udf.core.transformer.unary.TransparentTransformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LikeExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LikeExpression.java
index a023ad3cfc..ede6283ce5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LikeExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LikeExpression.java
@@ -23,27 +23,93 @@ import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.transformer.unary.RegularTransformer;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import java.nio.ByteBuffer;
+import java.util.regex.Pattern;
 
 public class LikeExpression extends UnaryExpression {
 
-  private final String pattern;
+  private final String patternString;
+  private final Pattern pattern;
 
-  public LikeExpression(Expression expression, String pattern) {
+  public LikeExpression(Expression expression, String patternString) {
     super(expression);
+    this.patternString = patternString;
+    pattern = compile();
+  }
+
+  public LikeExpression(Expression expression, String patternString, Pattern pattern) {
+    super(expression);
+    this.patternString = patternString;
     this.pattern = pattern;
   }
 
   public LikeExpression(ByteBuffer byteBuffer) {
     super(Expression.deserialize(byteBuffer));
-    pattern = ReadWriteIOUtils.readString(byteBuffer);
+    patternString = ReadWriteIOUtils.readString(byteBuffer);
+    pattern = compile();
+  }
+
+  /**
+   * The main idea of this part comes from
+   * https://codereview.stackexchange.com/questions/36861/convert-sql-like-to-regex/36864
+   */
+  private Pattern compile() {
+    String unescapeValue = unescapeString(patternString);
+    String specialRegexString = ".^$*+?{}[]|()";
+    StringBuilder patternBuilder = new StringBuilder();
+    patternBuilder.append("^");
+    for (int i = 0; i < unescapeValue.length(); i++) {
+      String ch = String.valueOf(unescapeValue.charAt(i));
+      if (specialRegexString.contains(ch)) {
+        ch = "\\" + unescapeValue.charAt(i);
+      }
+      if (i == 0
+          || !"\\".equals(String.valueOf(unescapeValue.charAt(i - 1)))
+          || i >= 2
+              && "\\\\"
+                  .equals(
+                      patternBuilder.substring(
+                          patternBuilder.length() - 2, patternBuilder.length()))) {
+        patternBuilder.append(ch.replace("%", ".*?").replace("_", "."));
+      } else {
+        patternBuilder.append(ch);
+      }
+    }
+    patternBuilder.append("$");
+    return Pattern.compile(patternBuilder.toString());
+  }
+
+  /**
+   * This Method is for un-escaping strings except '\' before special string '%', '_', '\', because
+   * we need to use '\' to judge whether to replace this to regexp string
+   */
+  private String unescapeString(String value) {
+    StringBuilder stringBuilder = new StringBuilder();
+    for (int i = 0; i < value.length(); i++) {
+      String ch = String.valueOf(value.charAt(i));
+      if ("\\".equals(ch)) {
+        if (i < value.length() - 1) {
+          String nextChar = String.valueOf(value.charAt(i + 1));
+          if ("%".equals(nextChar) || "_".equals(nextChar) || "\\".equals(nextChar)) {
+            stringBuilder.append(ch);
+          }
+          if ("\\".equals(nextChar)) {
+            i++;
+          }
+        }
+      } else {
+        stringBuilder.append(ch);
+      }
+    }
+    return stringBuilder.toString();
   }
 
   @Override
   protected String getExpressionStringInternal() {
-    return expression + " LIKE " + pattern;
+    return expression + " LIKE '" + pattern + "'";
   }
 
   @Override
@@ -53,17 +119,17 @@ public class LikeExpression extends UnaryExpression {
 
   @Override
   protected Transformer constructTransformer(LayerPointReader pointReader) {
-    throw new UnsupportedOperationException();
+    return new RegularTransformer(pointReader, pattern);
   }
 
   @Override
   protected Expression constructExpression(Expression childExpression) {
-    return new LikeExpression(childExpression, pattern);
+    return new LikeExpression(childExpression, patternString, pattern);
   }
 
   @Override
   protected void serialize(ByteBuffer byteBuffer) {
     super.serialize(byteBuffer);
-    ReadWriteIOUtils.write(pattern, byteBuffer);
+    ReadWriteIOUtils.write(patternString, byteBuffer);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
index 97a7c5ceb7..2c22a52841 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/LogicNotExpression.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.db.query.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.query.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.query.expression.multi.FunctionExpression;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.LogicNotTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.transformer.unary.LogicNotTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
index 5aaed35f55..8e12a85a57 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/NegationExpression.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.db.query.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.query.expression.leaf.TimeSeriesOperand;
 import org.apache.iotdb.db.query.expression.multi.FunctionExpression;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.db.query.udf.core.transformer.ArithmeticNegationTransformer;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.transformer.unary.ArithmeticNegationTransformer;
 
 import java.nio.ByteBuffer;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
index f2e74d597a..0c990731bd 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/expression/unary/RegularExpression.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ExpressionType;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.db.query.udf.core.transformer.unary.RegularTransformer;
 import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import org.apache.commons.lang3.Validate;
@@ -55,7 +56,7 @@ public class RegularExpression extends UnaryExpression {
 
   @Override
   protected Transformer constructTransformer(LayerPointReader pointReader) {
-    throw new UnsupportedOperationException();
+    return new RegularTransformer(pointReader, pattern);
   }
 
   @Override
@@ -65,7 +66,7 @@ public class RegularExpression extends UnaryExpression {
 
   @Override
   protected String getExpressionStringInternal() {
-    return expression + " REGEXP " + patternString;
+    return expression + " REGEXP '" + patternString + "'";
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
deleted file mode 100644
index 1fa710b208..0000000000
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticNegationTransformer.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.iotdb.db.query.udf.core.transformer;
-
-import org.apache.iotdb.db.exception.query.QueryProcessException;
-import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.io.IOException;
-
-public class ArithmeticNegationTransformer extends Transformer {
-
-  private final LayerPointReader layerPointReader;
-
-  public ArithmeticNegationTransformer(LayerPointReader layerPointReader) {
-    this.layerPointReader = layerPointReader;
-  }
-
-  @Override
-  public boolean isConstantPointReader() {
-    return layerPointReader.isConstantPointReader();
-  }
-
-  @Override
-  protected boolean cacheValue() throws QueryProcessException, IOException {
-    if (!layerPointReader.next()) {
-      return false;
-    }
-    // Constant doesn't have currentTime(), it will be determined by the other part in
-    // BinaryTransformer
-    if (!isConstantPointReader()) {
-      cachedTime = layerPointReader.currentTime();
-    }
-    if (layerPointReader.isCurrentNull()) {
-      currentNull = true;
-    } else {
-      switch (layerPointReader.getDataType()) {
-        case INT32:
-          cachedInt = -layerPointReader.currentInt();
-          break;
-        case INT64:
-          cachedLong = -layerPointReader.currentLong();
-          break;
-        case FLOAT:
-          cachedFloat = -layerPointReader.currentFloat();
-          break;
-        case DOUBLE:
-          cachedDouble = -layerPointReader.currentDouble();
-          break;
-        default:
-          throw new QueryProcessException(
-              "Unsupported data type: " + layerPointReader.getDataType().toString());
-      }
-    }
-    layerPointReader.readyForNext();
-    return true;
-  }
-
-  @Override
-  public TSDataType getDataType() {
-    return layerPointReader.getDataType();
-  }
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/Transformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/Transformer.java
index 258360973a..a666924a5c 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/Transformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/Transformer.java
@@ -55,7 +55,7 @@ public abstract class Transformer implements LayerPointReader {
   protected abstract boolean cacheValue() throws QueryProcessException, IOException;
 
   @Override
-  public void readyForNext() {
+  public final void readyForNext() {
     hasCachedValue = false;
     currentNull = false;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/TransparentTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/TransparentTransformer.java
deleted file mode 100644
index 650565de91..0000000000
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/TransparentTransformer.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.iotdb.db.query.udf.core.transformer;
-
-import org.apache.iotdb.db.exception.query.QueryProcessException;
-import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.io.IOException;
-
-/**
- * this is a special transformer which outputs data just as input without any modification.
- *
- * <p>i.e. it's just the function f(x) = x.
- *
- * <p>It's mainly used for a UDF with aggregation query as its parameters.
- */
-public class TransparentTransformer extends Transformer {
-
-  private final LayerPointReader reader;
-
-  public TransparentTransformer(LayerPointReader reader) {
-    super();
-    this.reader = reader;
-  }
-
-  @Override
-  public boolean isConstantPointReader() {
-    return false;
-  }
-
-  @Override
-  public TSDataType getDataType() {
-    return reader.getDataType();
-  }
-
-  @Override
-  protected boolean cacheValue() throws QueryProcessException, IOException {
-    if (!reader.next()) {
-      return false;
-    }
-    if (reader.isCurrentNull()) {
-      currentNull = true;
-    } else {
-      switch (reader.getDataType()) {
-        case BOOLEAN:
-          cachedBoolean = reader.currentBoolean();
-          break;
-        case DOUBLE:
-          cachedDouble = reader.currentDouble();
-          break;
-        case FLOAT:
-          cachedFloat = reader.currentFloat();
-          break;
-        case INT32:
-          cachedInt = reader.currentInt();
-          break;
-        case INT64:
-          cachedLong = reader.currentLong();
-          break;
-        case TEXT:
-          cachedBinary = reader.currentBinary();
-          break;
-        default:
-          throw new QueryProcessException("unsupported data type: " + reader.getDataType());
-      }
-    }
-    cachedTime = reader.currentTime();
-    return true;
-  }
-
-  @Override
-  public void readyForNext() {
-    super.readyForNext();
-    reader.readyForNext();
-  }
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticAdditionTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticAdditionTransformer.java
index a433ab55b1..4d9a2fbba5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticAdditionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticAdditionTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
similarity index 95%
copy from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
index 0b22c8feae..4df0b51acf 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticDivisionTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticDivisionTransformer.java
index b8d91d0a7f..03acdd89e8 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticDivisionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticDivisionTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticModuloTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticModuloTransformer.java
index 603d9941f3..bb6a2ccb17 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticModuloTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticModuloTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticMultiplicationTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticMultiplicationTransformer.java
index 4153bbf1d6..33482f63c1 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticMultiplicationTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticMultiplicationTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticSubtractionTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticSubtractionTransformer.java
index ddc6e60a6f..4472a40282 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticSubtractionTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticSubtractionTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/BinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/BinaryTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
index 658270e867..a7b6fc3700 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/BinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
@@ -17,10 +17,11 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
similarity index 95%
copy from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
index 4b5c3fed21..c14e884a7d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareEqualToTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareEqualToTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
index 024d38cc69..4370db3f7d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareEqualToTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterEqualTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterEqualTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java
index 7fddac6665..e6fa1cdbe2 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterEqualTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterThanTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterThanTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java
index fadd835167..5cac5cb273 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareGreaterThanTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessEqualTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessEqualTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java
index c5653dd7a7..6dde245ac9 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessEqualTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessThanTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessThanTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java
index 2082e13ded..d4e91e59ef 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareLessThanTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareNonEqualTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareNonEqualTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
index c5742def5e..203c113f26 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareNonEqualTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicAndTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicAndTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicAndTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicAndTransformer.java
index 887d419cf0..dd44e29408 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicAndTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicAndTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicBinaryTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
index 3b12e2df5a..a18549dabb 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicOrTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicOrTransformer.java
similarity index 95%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicOrTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicOrTransformer.java
index 3786936f67..e9250ea53e 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicOrTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicOrTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowTransformer.java
similarity index 96%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowTransformer.java
index 2b9250c11a..354a102736 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.multi;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowWindowTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowWindowTransformer.java
similarity index 96%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowWindowTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowWindowTransformer.java
index b06796d519..1f810694e2 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryRowWindowTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryRowWindowTransformer.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.multi;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
similarity index 96%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
index f714a4e329..c48ec13cee 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/UDFQueryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
@@ -17,11 +17,12 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.multi;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFExecutor;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
similarity index 50%
copy from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
copy to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
index 0b22c8feae..983c8ab238 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
@@ -17,25 +17,43 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
-public abstract class ArithmeticBinaryTransformer extends BinaryTransformer {
+import java.io.IOException;
 
-  protected ArithmeticBinaryTransformer(
-      LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
-    super(leftPointReader, rightPointReader);
+public class ArithmeticNegationTransformer extends UnaryTransformer {
+
+  public ArithmeticNegationTransformer(LayerPointReader layerPointReader) {
+    super(layerPointReader);
   }
 
   @Override
-  protected TransformerType getTransformerType() {
-    return TransformerType.Arithmetic;
+  public TSDataType getDataType() {
+    return layerPointReader.getDataType();
   }
 
   @Override
-  public TSDataType getDataType() {
-    return TSDataType.DOUBLE;
+  protected void transformAndCache() throws QueryProcessException, IOException {
+    switch (layerPointReader.getDataType()) {
+      case INT32:
+        cachedInt = -layerPointReader.currentInt();
+        break;
+      case INT64:
+        cachedLong = -layerPointReader.currentLong();
+        break;
+      case FLOAT:
+        cachedFloat = -layerPointReader.currentFloat();
+        break;
+      case DOUBLE:
+        cachedDouble = -layerPointReader.currentDouble();
+        break;
+      default:
+        throw new QueryProcessException(
+            "Unsupported data type: " + layerPointReader.getDataType().toString());
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
new file mode 100644
index 0000000000..46d59c0701
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
@@ -0,0 +1,149 @@
+/*
+ * 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.iotdb.db.query.udf.core.transformer.unary;
+
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+public class InTransformer extends UnaryTransformer {
+
+  private final TSDataType dataType;
+
+  private Set<Integer> intSet;
+  private Set<Long> longSet;
+  private Set<Float> floatSet;
+  private Set<Double> doubleSet;
+  private Set<Boolean> booleanSet;
+  private Set<String> stringSet;
+
+  public InTransformer(LayerPointReader layerPointReader, Set<String> values) {
+    super(layerPointReader);
+    dataType = layerPointReader.getDataType();
+    initTypedSet(values);
+  }
+
+  private void initTypedSet(Set<String> values) {
+    switch (dataType) {
+      case INT32:
+        intSet = new HashSet<>();
+        for (String value : values) {
+          intSet.add(Integer.valueOf(value));
+        }
+        break;
+      case INT64:
+        longSet = new HashSet<>();
+        for (String value : values) {
+          longSet.add(Long.valueOf(value));
+        }
+        break;
+      case FLOAT:
+        floatSet = new HashSet<>();
+        for (String value : values) {
+          floatSet.add(Float.valueOf(value));
+        }
+        break;
+      case DOUBLE:
+        doubleSet = new HashSet<>();
+        for (String value : values) {
+          doubleSet.add(Double.valueOf(value));
+        }
+        break;
+      case BOOLEAN:
+        booleanSet = new HashSet<>();
+        for (String value : values) {
+          booleanSet.add(Boolean.valueOf(value));
+        }
+        break;
+      case TEXT:
+        stringSet = values;
+        break;
+      default:
+        throw new UnsupportedOperationException(
+            "unsupported data type: " + layerPointReader.getDataType());
+    }
+  }
+
+  @Override
+  public TSDataType getDataType() {
+    return dataType;
+  }
+
+  @Override
+  protected void transformAndCache() throws QueryProcessException, IOException {
+    switch (dataType) {
+      case INT32:
+        int intValue = layerPointReader.currentInt();
+        if (intSet.contains(intValue)) {
+          cachedInt = intValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      case INT64:
+        long longValue = layerPointReader.currentLong();
+        if (longSet.contains(longValue)) {
+          cachedLong = longValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      case FLOAT:
+        float floatValue = layerPointReader.currentFloat();
+        if (floatSet.contains(floatValue)) {
+          cachedFloat = floatValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      case DOUBLE:
+        double doubleValue = layerPointReader.currentDouble();
+        if (doubleSet.contains(doubleValue)) {
+          cachedDouble = doubleValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      case BOOLEAN:
+        boolean booleanValue = layerPointReader.currentBoolean();
+        if (booleanSet.contains(booleanValue)) {
+          cachedBoolean = booleanValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      case TEXT:
+        Binary binaryValue = layerPointReader.currentBinary();
+        if (stringSet.contains(binaryValue.getStringValue())) {
+          cachedBinary = binaryValue;
+        } else {
+          currentNull = true;
+        }
+        break;
+      default:
+        throw new QueryProcessException("unsupported data type: " + layerPointReader.getDataType());
+    }
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
similarity index 62%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
index 4b5c3fed21..1bf9499c29 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/CompareBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
@@ -17,25 +17,32 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
-public abstract class CompareBinaryTransformer extends BinaryTransformer {
+import java.io.IOException;
 
-  protected CompareBinaryTransformer(
-      LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
-    super(leftPointReader, rightPointReader);
-  }
+public class LogicNotTransformer extends UnaryTransformer {
 
-  @Override
-  protected TransformerType getTransformerType() {
-    return TransformerType.Comparative;
+  public LogicNotTransformer(LayerPointReader layerPointReader) {
+    super(layerPointReader);
   }
 
   @Override
   public TSDataType getDataType() {
     return TSDataType.BOOLEAN;
   }
+
+  @Override
+  protected void transformAndCache() throws QueryProcessException, IOException {
+    if (layerPointReader.getDataType() != TSDataType.BOOLEAN) {
+      throw new QueryProcessException(
+          "Unsupported data type: " + layerPointReader.getDataType().toString());
+    }
+
+    cachedBoolean = !layerPointReader.currentBoolean();
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
similarity index 51%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
index 0b22c8feae..cceb55b9cd 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/ArithmeticBinaryTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
@@ -17,25 +17,42 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.utils.Binary;
 
-public abstract class ArithmeticBinaryTransformer extends BinaryTransformer {
+import java.io.IOException;
+import java.util.regex.Pattern;
 
-  protected ArithmeticBinaryTransformer(
-      LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
-    super(leftPointReader, rightPointReader);
+public class RegularTransformer extends UnaryTransformer {
+
+  private final Pattern pattern;
+
+  public RegularTransformer(LayerPointReader layerPointReader, Pattern pattern) {
+    super(layerPointReader);
+    this.pattern = pattern;
   }
 
   @Override
-  protected TransformerType getTransformerType() {
-    return TransformerType.Arithmetic;
+  public TSDataType getDataType() {
+    return TSDataType.TEXT;
   }
 
   @Override
-  public TSDataType getDataType() {
-    return TSDataType.DOUBLE;
+  protected void transformAndCache() throws QueryProcessException, IOException {
+    if (layerPointReader.getDataType() != TSDataType.TEXT) {
+      throw new QueryProcessException(
+          "Unsupported data type: " + layerPointReader.getDataType().toString());
+    }
+
+    Binary binary = layerPointReader.currentBinary();
+    if (pattern.matcher(binary.getStringValue()).find()) {
+      cachedBinary = binary;
+    } else {
+      currentNull = true;
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
new file mode 100644
index 0000000000..24cae21f52
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
@@ -0,0 +1,70 @@
+/*
+ * 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.iotdb.db.query.udf.core.transformer.unary;
+
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.IOException;
+
+/**
+ * this is a special transformer which outputs data just as input without any modification.
+ *
+ * <p>i.e. it's just the function f(x) = x.
+ *
+ * <p>It's mainly used for a UDF with aggregation query as its parameters.
+ */
+public class TransparentTransformer extends UnaryTransformer {
+
+  public TransparentTransformer(LayerPointReader layerPointReader) {
+    super(layerPointReader);
+  }
+
+  @Override
+  public TSDataType getDataType() {
+    return layerPointReader.getDataType();
+  }
+
+  @Override
+  protected void transformAndCache() throws QueryProcessException, IOException {
+    switch (layerPointReader.getDataType()) {
+      case BOOLEAN:
+        cachedBoolean = layerPointReader.currentBoolean();
+        break;
+      case DOUBLE:
+        cachedDouble = layerPointReader.currentDouble();
+        break;
+      case FLOAT:
+        cachedFloat = layerPointReader.currentFloat();
+        break;
+      case INT32:
+        cachedInt = layerPointReader.currentInt();
+        break;
+      case INT64:
+        cachedLong = layerPointReader.currentLong();
+        break;
+      case TEXT:
+        cachedBinary = layerPointReader.currentBinary();
+        break;
+      default:
+        throw new QueryProcessException("unsupported data type: " + layerPointReader.getDataType());
+    }
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicNotTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
similarity index 60%
rename from server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicNotTransformer.java
rename to server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
index c02c5ea2a6..5d3abf6931 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/LogicNotTransformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
@@ -17,54 +17,46 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.query.udf.core.transformer;
+package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
 
 import java.io.IOException;
 
-public class LogicNotTransformer extends Transformer {
-  private final LayerPointReader layerPointReader;
+public abstract class UnaryTransformer extends Transformer {
 
-  public LogicNotTransformer(LayerPointReader layerPointReader) {
+  protected final LayerPointReader layerPointReader;
+
+  public UnaryTransformer(LayerPointReader layerPointReader) {
     this.layerPointReader = layerPointReader;
   }
 
   @Override
-  public boolean isConstantPointReader() {
+  public final boolean isConstantPointReader() {
     return layerPointReader.isConstantPointReader();
   }
 
   @Override
-  protected boolean cacheValue() throws QueryProcessException, IOException {
+  protected final boolean cacheValue() throws QueryProcessException, IOException {
     if (!layerPointReader.next()) {
       return false;
     }
-    // Constant doesn't have currentTime(), it will be determined by the other part in
-    // BinaryTransformer
+
     if (!isConstantPointReader()) {
       cachedTime = layerPointReader.currentTime();
     }
+
     if (layerPointReader.isCurrentNull()) {
       currentNull = true;
     } else {
-      switch (layerPointReader.getDataType()) {
-        case BOOLEAN:
-          cachedBoolean = !layerPointReader.currentBoolean();
-          break;
-        default:
-          throw new QueryProcessException(
-              "Unsupported data type: " + layerPointReader.getDataType().toString());
-      }
+      transformAndCache();
     }
+
     layerPointReader.readyForNext();
     return true;
   }
 
-  @Override
-  public TSDataType getDataType() {
-    return TSDataType.BOOLEAN;
-  }
+  protected abstract void transformAndCache() throws QueryProcessException, IOException;
 }