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

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

commit fcd6c7c0b554b855fcbad68a0113f422a1982e8a
Author: peacewong <[email protected]>
AuthorDate: Fri Sep 22 12:09:28 2023 +0800

    1. add result set sot utils class
    2. optimize variable operation logic
---
 .../java/org/apache/linkis/common/io/FsPath.java   |   5 +
 .../apache/linkis/common/utils/ByteTimeUtils.java  |  13 +-
 .../apache/linkis/common/utils/ResultSetUtils.java |  57 ++++++++
 .../common/utils/VariableOperationUtils.java       |  43 ++++--
 .../apache/linkis/common/utils/VariableUtils.scala |  24 +++-
 .../linkis/common/utils/ByteTimeUtilsTest.java     | 152 +++++++++++++++++++--
 .../linkis/common/utils/VariableUtilsTest.scala    |  17 +++
 7 files changed, 284 insertions(+), 27 deletions(-)

diff --git 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/io/FsPath.java
 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/io/FsPath.java
index 7908e5a50..b5e9af86f 100644
--- 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/io/FsPath.java
+++ 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/io/FsPath.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.file.FileSystems;
 import java.nio.file.Paths;
 import java.nio.file.attribute.PosixFilePermission;
 import java.nio.file.attribute.PosixFilePermissions;
@@ -168,6 +169,10 @@ public class FsPath {
     return new File(uri);
   }
 
+  public Path toPath() {
+    return FileSystems.getDefault().getPath(uri.toString());
+  }
+
   public String getUriString() {
     return uri.toString();
   }
diff --git 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ByteTimeUtils.java
 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ByteTimeUtils.java
index d23f4a086..0ecb3dc2a 100644
--- 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ByteTimeUtils.java
+++ 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ByteTimeUtils.java
@@ -213,7 +213,6 @@ public class ByteTimeUtils {
       } else {
         throw new NumberFormatException("Failed to parse byte string: " + str);
       }
-      suffix = suffix.toLowerCase();
       // Check for invalid suffixes
       if (suffix != null && !byteSuffixes.containsKey(suffix)) {
         throw new NumberFormatException("Invalid suffix: \"" + suffix + "\"");
@@ -297,6 +296,18 @@ public class ByteTimeUtils {
     return parseByteString(str, ByteUnit.GiB);
   }
 
+  /**
+   * Convert a passed byte string (e.g. -50b, -100k, or -250m) to gibibytes 
for internal use.
+   *
+   * <p>If no suffix is provided, the passed number is assumed to be in 
gibibytes.
+   */
+  public static long negativeByteStringAsGb(String str) {
+    if (str.startsWith("-")) {
+      return Math.negateExact(parseByteString(str.substring(1), ByteUnit.GiB));
+    }
+    return parseByteString(str, ByteUnit.GiB);
+  }
+
   /**
    * Returns a byte array with the buffer's contents, trying to avoid copying 
the data if possible.
    */
diff --git 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ResultSetUtils.java
 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ResultSetUtils.java
new file mode 100644
index 000000000..a367b38b8
--- /dev/null
+++ 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/ResultSetUtils.java
@@ -0,0 +1,57 @@
+/*
+ * 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.linkis.common.utils;
+
+import org.apache.linkis.common.io.FsPath;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ResultSetUtils {
+
+  // Sort in ASC order by numx in the result set _numx.dolphin file name
+  public static Comparator<FsPath> getResultSetFileComparatorOrderByNameNum() {
+
+    Comparator<FsPath> comparator =
+        (o1, o2) -> {
+          // get the num of file name
+          String regx = "\\d+";
+
+          String[] res1 = o1.getPath().split(File.separator);
+          String fileName1 = res1[res1.length - 1];
+          Matcher matcher1 = Pattern.compile(regx).matcher(fileName1);
+          int num1 = matcher1.find() ? Integer.parseInt(matcher1.group()) : 
Integer.MAX_VALUE;
+
+          String[] res2 = o2.getPath().split(File.separator);
+          String fileName2 = res2[res2.length - 1];
+          Matcher matcher2 = Pattern.compile(regx).matcher(fileName2);
+          int num2 = matcher2.find() ? Integer.parseInt(matcher2.group()) : 
Integer.MAX_VALUE;
+
+          return num1 - num2;
+        };
+    return comparator;
+  }
+
+  public static void sortByNameNum(List<FsPath> fsPathList) {
+    Collections.sort(fsPathList, getResultSetFileComparatorOrderByNameNum());
+  }
+}
diff --git 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/VariableOperationUtils.java
 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/VariableOperationUtils.java
index b891f99d1..615472474 100644
--- 
a/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/VariableOperationUtils.java
+++ 
b/linkis-commons/linkis-common/src/main/java/org/apache/linkis/common/utils/VariableOperationUtils.java
@@ -28,7 +28,10 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -49,6 +52,9 @@ public class VariableOperationUtils {
   private static final String[] CYCLES =
       new String[] {CYCLE_YEAR, CYCLE_MONTH, CYCLE_DAY, CYCLE_HOUR, 
CYCLE_MINUTE, CYCLE_SECOND};
 
+  private static final ObjectMapper mapper =
+      
JsonMapper.builder().enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS).build();
+
   /**
    * yyyy-MM-dd HH:mm:ss
    *
@@ -78,30 +84,44 @@ public class VariableOperationUtils {
    * @param str
    * @return
    */
+  @Deprecated
   public static String replaces(ZonedDateTime dateTime, String str)
       throws VariableOperationFailedException {
-    return replaces(dateTime, str, true);
+    try {
+      JsonNode rootNode = mapper.readTree(str);
+      if (rootNode.isArray() || rootNode.isObject()) {
+        replaceJson(dateTime, rootNode);
+        return rootNode.toString();
+      }
+    } catch (Exception e) {
+      return replace(dateTime, str);
+    }
+    return replace(dateTime, str);
   }
 
   /**
    * json support variable operation
    *
+   * @param codeType
    * @param dateTime
    * @param str
-   * @param format
    * @return
    */
-  public static String replaces(ZonedDateTime dateTime, String str, boolean 
format)
+  public static String replaces(String codeType, ZonedDateTime dateTime, 
String str)
       throws VariableOperationFailedException {
-    try {
-      JsonNode rootNode = JsonUtils.jackson().readTree(str);
-      if (rootNode.isArray() || rootNode.isObject()) {
-        replaceJson(dateTime, rootNode);
-        return rootNode.toString();
+    String languageType = 
CodeAndRunTypeUtils.getLanguageTypeByCodeType(codeType, "");
+    if (languageType.equals(CodeAndRunTypeUtils.LANGUAGE_TYPE_JSON())) {
+      try {
+        JsonNode rootNode = mapper.readTree(str);
+        if (rootNode.isArray() || rootNode.isObject()) {
+          replaceJson(dateTime, rootNode);
+          return rootNode.toString();
+        }
+      } catch (Exception e) {
+        return replace(dateTime, str);
       }
-    } catch (Exception e) {
-      return replace(dateTime, str);
     }
+
     return replace(dateTime, str);
   }
 
@@ -197,8 +217,7 @@ public class VariableOperationUtils {
         } else if (temp.isObject()) {
           replaceJson(dateTime, temp);
         } else {
-          arrayNode.remove(i);
-          arrayNode.insert(i, replace(dateTime, temp.toString()));
+          arrayNode.set(i, replace(dateTime, temp.toString()));
         }
       }
     } else if (object.isObject()) {
diff --git 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
index 30bdeb4b1..6c5bd7cf3 100644
--- 
a/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
+++ 
b/linkis-commons/linkis-common/src/main/scala/org/apache/linkis/common/utils/VariableUtils.scala
@@ -143,9 +143,10 @@ object VariableUtils extends Logging {
     }
     initAllDateVars(run_date, nameAndType)
     val codeOperation = parserVar(code, nameAndType)
-    parserDate(codeOperation, run_date)
+    parserDate(codeType, codeOperation, run_date)
   }
 
+  @deprecated
   private def parserDate(code: String, run_date: CustomDateType): String = {
     if (Configuration.VARIABLE_OPERATION) {
       val zonedDateTime: ZonedDateTime = 
VariableOperationUtils.toZonedDateTime(run_date.getDate)
@@ -155,6 +156,15 @@ object VariableUtils extends Logging {
     }
   }
 
+  private def parserDate(codeType: String, code: String, run_date: 
CustomDateType): String = {
+    if (Configuration.VARIABLE_OPERATION) {
+      val zonedDateTime: ZonedDateTime = 
VariableOperationUtils.toZonedDateTime(run_date.getDate)
+      VariableOperationUtils.replaces(codeType, zonedDateTime, code)
+    } else {
+      code
+    }
+  }
+
   private def initAllDateVars(
       run_date: CustomDateType,
       nameAndType: mutable.Map[String, variable.VariableType]
@@ -337,7 +347,7 @@ object VariableUtils extends Logging {
    *
    * @param code
    *   :code
-   * @param codeType
+   * @param languageType
    *   :SQL,PYTHON
    * @return
    */
@@ -346,27 +356,37 @@ object VariableUtils extends Logging {
 
     var varString: String = null
     var errString: String = null
+    var rightVarString: String = null
 
     languageType match {
       case CodeAndRunTypeUtils.LANGUAGE_TYPE_SQL =>
         varString = """\s*--@set\s*.+\s*"""
+        rightVarString = """^\s*--@set\s*.+\s*"""
         errString = """\s*--@.*"""
       case CodeAndRunTypeUtils.LANGUAGE_TYPE_PYTHON | 
CodeAndRunTypeUtils.LANGUAGE_TYPE_SHELL =>
         varString = """\s*#@set\s*.+\s*"""
+        rightVarString = """^\s*#@set\s*.+\s*"""
         errString = """\s*#@"""
       case CodeAndRunTypeUtils.LANGUAGE_TYPE_SCALA =>
         varString = """\s*//@set\s*.+\s*"""
+        rightVarString = """^\s*//@set\s*.+\s*"""
         errString = """\s*//@.+"""
       case CodeAndRunTypeUtils.LANGUAGE_TYPE_JAVA =>
         varString = """\s*!!@set\s*.+\s*"""
+        rightVarString = """^\s*!!@set\s*.+\s*"""
       case _ =>
         return nameAndValue
     }
 
     val customRegex = varString.r.unanchored
+    val customRightRegex = rightVarString.r.unanchored
     val errRegex = errString.r.unanchored
     code.split("\n").foreach { str =>
       {
+
+        if (customRightRegex.unapplySeq(str).size < 
customRegex.unapplySeq(str).size) {
+          logger.warn(s"code:$str is wrong custom variable format!!!")
+        }
         str match {
           case customRegex() =>
             val clearStr = if (str.endsWith(";")) str.substring(0, str.length 
- 1) else str
diff --git 
a/linkis-commons/linkis-common/src/test/java/org/apache/linkis/common/utils/ByteTimeUtilsTest.java
 
b/linkis-commons/linkis-common/src/test/java/org/apache/linkis/common/utils/ByteTimeUtilsTest.java
index 7b90f053c..f548d89d4 100644
--- 
a/linkis-commons/linkis-common/src/test/java/org/apache/linkis/common/utils/ByteTimeUtilsTest.java
+++ 
b/linkis-commons/linkis-common/src/test/java/org/apache/linkis/common/utils/ByteTimeUtilsTest.java
@@ -17,31 +17,159 @@
 
 package org.apache.linkis.common.utils;
 
+import java.util.function.Function;
+
+import com.google.common.collect.ImmutableMap;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
-
 class ByteTimeUtilsTest {
 
+  private static final ImmutableMap<String, Function<String, Long>> opFunction 
=
+      ImmutableMap.<String, Function<String, Long>>builder()
+          .put("byteStringAsBytes", tar -> 
ByteTimeUtils.byteStringAsBytes(tar))
+          .put("byteStringAsKb", tar -> ByteTimeUtils.byteStringAsKb(tar))
+          .put("byteStringAsMb", tar -> ByteTimeUtils.byteStringAsMb(tar))
+          .put("byteStringAsGb", tar -> ByteTimeUtils.byteStringAsGb(tar))
+          .build();
+
+  private static final ImmutableMap<String, Long> convertToByte =
+      ImmutableMap.<String, Long>builder()
+          .put("1", 1l)
+          .put("1b", 1l)
+          .put("1B", 1l)
+          .put("1k", 1024l)
+          .put("1K", 1024l)
+          .put("1kb", 1024l)
+          .put("1Kb", 1024l)
+          .put("1kB", 1024l)
+          .put("1KB", 1024l)
+          .put("1m", 1024l * 1024l)
+          .put("1M", 1024l * 1024l)
+          .put("1mb", 1024l * 1024l)
+          .put("1Mb", 1024l * 1024l)
+          .put("1mB", 1024l * 1024l)
+          .put("1MB", 1024l * 1024l)
+          .put("1g", 1024l * 1024l * 1024l)
+          .put("1G", 1024l * 1024l * 1024l)
+          .put("1gb", 1024l * 1024l * 1024l)
+          .put("1gB", 1024l * 1024l * 1024l)
+          .put("1Gb", 1024l * 1024l * 1024l)
+          .put("1GB", 1024l * 1024l * 1024l)
+          .put("1t", 1024l * 1024l * 1024l * 1024l)
+          .put("1T", 1024l * 1024l * 1024l * 1024l)
+          .put("1tb", 1024l * 1024l * 1024l * 1024l)
+          .put("1Tb", 1024l * 1024l * 1024l * 1024l)
+          .put("1tB", 1024l * 1024l * 1024l * 1024l)
+          .put("1TB", 1024l * 1024l * 1024l * 1024l)
+          .put("1p", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .put("1P", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .put("1pb", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .put("1Pb", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .put("1pB", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .put("1PB", 1024l * 1024l * 1024l * 1024l * 1024l)
+          .build();
+
+  private static final ImmutableMap<String, Long> convertToKB =
+      ImmutableMap.<String, Long>builder()
+          .put("1", 1l)
+          .put("1024b", 1l)
+          .put("1024B", 1l)
+          .put("1k", 1l)
+          .put("1K", 1l)
+          .put("1kb", 1l)
+          .put("1Kb", 1l)
+          .put("1kB", 1l)
+          .put("1KB", 1l)
+          .put("1m", 1024l)
+          .put("1M", 1024l)
+          .put("1mb", 1024l)
+          .put("1Mb", 1024l)
+          .put("1mB", 1024l)
+          .put("1MB", 1024l)
+          .put("1g", 1024l * 1024l)
+          .put("1G", 1024l * 1024l)
+          .put("1gb", 1024l * 1024l)
+          .put("1gB", 1024l * 1024l)
+          .put("1Gb", 1024l * 1024l)
+          .put("1GB", 1024l * 1024l)
+          .build();
+
+  private static final ImmutableMap<String, Long> convertToMB =
+      ImmutableMap.<String, Long>builder()
+          .put("1", 1l)
+          .put("1024k", 1l)
+          .put("1024K", 1l)
+          .put("1024kb", 1l)
+          .put("1024Kb", 1l)
+          .put("1024kB", 1l)
+          .put("1024KB", 1l)
+          .put("1m", 1l)
+          .put("1M", 1l)
+          .put("1mb", 1l)
+          .put("1Mb", 1l)
+          .put("1mB", 1l)
+          .put("1MB", 1l)
+          .put("1g", 1024l)
+          .put("1G", 1024l)
+          .put("1gb", 1024l)
+          .put("1gB", 1024l)
+          .put("1Gb", 1024l)
+          .put("1GB", 1024l)
+          .build();
+
+  private static final ImmutableMap<String, Long> convertToGB =
+      ImmutableMap.<String, Long>builder()
+          .put("1", 1l)
+          .put("1024m", 1l)
+          .put("1024M", 1l)
+          .put("1024mb", 1l)
+          .put("1024Mb", 1l)
+          .put("1024mB", 1l)
+          .put("1024MB", 1l)
+          .put("1g", 1l)
+          .put("1G", 1l)
+          .put("1gb", 1l)
+          .put("1gB", 1l)
+          .put("1Gb", 1l)
+          .put("1GB", 1l)
+          .put("1t", 1024l)
+          .put("1T", 1024l)
+          .put("1tb", 1024l)
+          .put("1Tb", 1024l)
+          .put("1tB", 1024l)
+          .put("1TB", 1024l)
+          .build();
+
   @Test
-  void byteStringAsBytes() {}
+  void byteStringAsBytes() {
+    convertToByte.forEach(
+        (k, v) -> 
Assertions.assertEquals(opFunction.get("byteStringAsBytes").apply(k), v));
+    Assertions.assertThrows(
+        IllegalArgumentException.class, () -> 
opFunction.get("byteStringAsBytes").apply("1A"));
+  }
 
   @Test
-  void byteStringAsKb() {}
+  void byteStringAsKb() {
+    convertToKB.forEach(
+        (k, v) -> 
Assertions.assertEquals(opFunction.get("byteStringAsKb").apply(k), v));
+    Assertions.assertThrows(
+        IllegalArgumentException.class, () -> 
opFunction.get("byteStringAsKb").apply("1a"));
+  }
 
   @Test
-  void byteStringAsMb() {}
+  void byteStringAsMb() {
+    convertToMB.forEach(
+        (k, v) -> 
Assertions.assertEquals(opFunction.get("byteStringAsMb").apply(k), v));
+    Assertions.assertThrows(
+        IllegalArgumentException.class, () -> 
opFunction.get("byteStringAsMb").apply("1c"));
+  }
 
   @Test
   void byteStringAsGb() {
-    Long res = ByteTimeUtils.byteStringAsGb("1G");
-    Assertions.assertEquals(res, 1);
-
+    convertToGB.forEach(
+        (k, v) -> 
Assertions.assertEquals(opFunction.get("byteStringAsGb").apply(k), v));
     Assertions.assertThrows(
-        NullPointerException.class,
-        () -> {
-          ByteTimeUtils.byteStringAsGb("512");
-        });
+        IllegalArgumentException.class, () -> 
opFunction.get("byteStringAsGb").apply("1C"));
   }
 }
diff --git 
a/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
 
b/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
index c0d4ad1d6..e7a105497 100644
--- 
a/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
+++ 
b/linkis-commons/linkis-common/src/test/scala/org/apache/linkis/common/utils/VariableUtilsTest.scala
@@ -22,6 +22,8 @@ import 
org.apache.linkis.common.variable.DateTypeUtils.{getCurHour, getToday}
 
 import java.util
 
+import scala.collection.mutable
+
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
@@ -63,4 +65,19 @@ class VariableUtilsTest {
     assertEquals(VariableUtils.replace(sql, "sql", varMap), resSql)
   }
 
+  @Test
+  def testGetCustomVar: Unit = {
+    var scalaCode = "" +
+      "-------@set globalpara=60--------\n" +
+      "--@set globalpara2=66\n" +
+      "select ${globalpara} as globalpara,\n" +
+      "-- ${globalpara1} as globalpara1, \n" +
+      "${globalpara2} as globalpara2;\n"
+    var pythonCode = ""
+
+    val nameAndValue: mutable.Map[String, String] =
+      VariableUtils.getCustomVar(scalaCode, 
CodeAndRunTypeUtils.LANGUAGE_TYPE_SQL);
+    assertEquals(nameAndValue.size, 2)
+  }
+
 }


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

Reply via email to