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

wusheng pushed a commit to branch groovy-replace
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit faf7d56af8fa13e5739464bff48d1690ff61f111
Author: Wu Sheng <[email protected]>
AuthorDate: Mon Mar 2 22:14:35 2026 +0800

    Update LAL CLAUDE.md to document LalRuntimeHelper and clean up Javadoc
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 oap-server/analyzer/log-analyzer/CLAUDE.md         | 25 +++++++++++++++++-----
 .../analyzer/v2/compiler/rt/LalRuntimeHelper.java  |  5 ++---
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/oap-server/analyzer/log-analyzer/CLAUDE.md 
b/oap-server/analyzer/log-analyzer/CLAUDE.md
index 4e1dd62d44..2f1ed2ace6 100644
--- a/oap-server/analyzer/log-analyzer/CLAUDE.md
+++ b/oap-server/analyzer/log-analyzer/CLAUDE.md
@@ -36,6 +36,7 @@ oap-server/analyzer/log-analyzer/
     rt/
       LalExpressionPackageHolder.java   — Class loading anchor (empty marker)
       BindingAware.java                 — Interface for consumers needing 
Binding access
+      LalRuntimeHelper.java             — Static helpers called by generated 
code
 
   src/test/java/.../compiler/
     LALScriptParserTest.java            — 20 parser tests
@@ -54,6 +55,7 @@ All v2 classes live under 
`org.apache.skywalking.oap.log.analyzer.v2.*` to avoid
 | Consumer classes | 
`org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalExpr_<N>_C<M>` |
 | Package holder | 
`org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalExpressionPackageHolder`
 |
 | Binding aware | 
`org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.BindingAware` |
+| Runtime helper | 
`org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalRuntimeHelper` |
 | Functional interface | 
`org.apache.skywalking.oap.log.analyzer.v2.dsl.LalExpression` |
 
 `<N>` is a global `AtomicInteger` counter. `<M>` is the consumer index within 
the script.
@@ -95,7 +97,7 @@ Three classes are generated:
    // implements Consumer, BindingAware
    public void accept(Object arg) {
      ExtractorSpec _t = (ExtractorSpec) arg;
-     _t.service(toStr(getAt(binding.parsed(), "service")));
+     
_t.service(LalRuntimeHelper.toStr(LalRuntimeHelper.getAt(binding.parsed(), 
"service")));
    }
    ```
 
@@ -122,13 +124,26 @@ Three classes are generated:
 
 ## Null-Safe String Conversion
 
-Generated code uses `toStr()` instead of `String.valueOf()` for casting parsed 
values to String:
-```java
-private static String toStr(Object obj) { return obj == null ? null : 
String.valueOf(obj); }
-```
+Generated code calls `LalRuntimeHelper.toStr()` instead of `String.valueOf()` 
for casting parsed values to String.
 This preserves Java `null` for missing fields (matching Groovy's `null as 
String` → `null` behavior),
 whereas `String.valueOf(null)` would produce the string `"null"`.
 
+## Runtime Helpers (LalRuntimeHelper)
+
+All type coercion and field access logic lives in `LalRuntimeHelper` as 
`public static` methods,
+called by generated code via FQCN. This avoids duplicating helper methods in 
every generated class.
+
+| Method | Purpose |
+|--------|---------|
+| `getAt(Object, String)` | Property/map access on parsed log data 
(`Binding.Parsed`, `Map`, or reflective field) |
+| `toLong(Object)` | Number/String → `long` |
+| `toInt(Object)` | Number/String → `int` |
+| `toStr(Object)` | Null-safe `String.valueOf()` (returns `null` for null 
input) |
+| `toBool(Object)` | Boolean coercion |
+| `isTruthy(Object)` | Groovy-style truthiness (null/empty/zero → false) |
+| `tagValue(Binding, String)` | Log tag lookup via protobuf 
`KeyStringValuePair` |
+| `safeCall(Object, String)` | Safe navigation `?.method()` (toString, trim, 
isEmpty) |
+
 ## Data-Driven Execution Tests
 
 `LALExpressionExecutionTest` loads LAL rules from YAML and mock input from 
`.input.data` files:
diff --git 
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java
 
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java
index cc5e0fccb9..3db295e401 100644
--- 
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java
+++ 
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java
@@ -23,9 +23,8 @@ import 
org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
 import org.apache.skywalking.oap.log.analyzer.v2.dsl.Binding;
 
 /**
- * Static helper methods called by v2-generated {@code LalExpression} and 
consumer classes.
- * Centralizes type coercion and field access logic that was previously 
duplicated
- * into every generated class via {@code addHelperMethods()}.
+ * Static helper methods for type coercion and field access, called by
+ * v2-generated {@code LalExpression} and consumer classes via FQCN static 
calls.
  */
 public final class LalRuntimeHelper {
 

Reply via email to