Skip to content

Commit c8668f4

Browse files
committed
abs func
1 parent d872280 commit c8668f4

File tree

4 files changed

+136
-6
lines changed

4 files changed

+136
-6
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*-
2+
* #%L
3+
* OBKV Table Client Framework
4+
* %%
5+
* Copyright (C) 2025 OceanBase
6+
* %%
7+
* OBKV Table Client Framework is licensed under Mulan PSL v2.
8+
* You can use this software according to the terms and conditions of the Mulan PSL v2.
9+
* You may obtain a copy of Mulan PSL v2 at:
10+
* http://license.coscl.org.cn/MulanPSL2
11+
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
12+
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
13+
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
14+
* See the Mulan PSL v2 for more details.
15+
* #L%
16+
*/
17+
18+
package com.alipay.oceanbase.rpc.protocol.payload.impl.column;
19+
20+
import com.alipay.oceanbase.rpc.protocol.payload.impl.ObCollationType;
21+
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
25+
public class ObGeneratedColumnAbsFunc implements ObGeneratedColumnSimpleFunc {
26+
private final List<String> refColumnNames;
27+
28+
/*
29+
* Ob generated column refer func.
30+
*/
31+
public ObGeneratedColumnAbsFunc(String refColumn) {
32+
List<String> refColumnNameList = new ArrayList<String>(1);
33+
refColumnNameList.add(refColumn);
34+
this.refColumnNames = refColumnNameList;
35+
}
36+
37+
/*
38+
* Set parameters.
39+
*/
40+
@Override
41+
public void setParameters(List<Object> parameters) {
42+
//ignore
43+
}
44+
45+
/*
46+
* Get min parameters.
47+
*/
48+
@Override
49+
public int getMinParameters() {
50+
return 0;
51+
}
52+
53+
/*
54+
* Get max parameters.
55+
*/
56+
@Override
57+
public int getMaxParameters() {
58+
return 0;
59+
}
60+
61+
/*
62+
* Get ref column names.
63+
*/
64+
@Override
65+
public List<String> getRefColumnNames() {
66+
return refColumnNames;
67+
}
68+
69+
/*
70+
* Eval value.
71+
*/
72+
@Override
73+
public Object evalValue(ObCollationType collationType, Object... refs)
74+
throws IllegalArgumentException {
75+
if (refs == null || refs.length == 0) {
76+
throw new IllegalArgumentException("Input references cannot be null or empty");
77+
}
78+
Object ref = refs[0];
79+
if (ref instanceof Long) {
80+
return Math.abs((Long) ref);
81+
} else if (ref instanceof Integer) {
82+
return Math.abs((Integer) ref);
83+
} else {
84+
throw new IllegalArgumentException("Object [" + ref + "] can not evaluate by"
85+
+ " ObGeneratedColumnNegateFunc");
86+
}
87+
}
88+
}

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/parser/ObGeneratedColumnExpressParser.java

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
package com.alipay.oceanbase.rpc.protocol.payload.impl.parser;
1919

2020
import com.alipay.oceanbase.rpc.exception.GenerateColumnParseException;
21-
import com.alipay.oceanbase.rpc.protocol.payload.impl.column.ObGeneratedColumnNegateFunc;
22-
import com.alipay.oceanbase.rpc.protocol.payload.impl.column.ObGeneratedColumnReferFunc;
23-
import com.alipay.oceanbase.rpc.protocol.payload.impl.column.ObGeneratedColumnSimpleFunc;
24-
import com.alipay.oceanbase.rpc.protocol.payload.impl.column.ObGeneratedColumnSubStrFunc;
21+
import com.alipay.oceanbase.rpc.protocol.payload.impl.column.*;
2522

2623
import java.math.BigInteger;
2724
import java.util.ArrayList;
@@ -60,6 +57,8 @@ public ObGeneratedColumnSimpleFunc parse() throws GenerateColumnParseException {
6057
lexer.nextToken();
6158
listParameters(subStr);
6259
return subStr;
60+
case ABS:
61+
return handleAbsFunction();
6362
default:
6463
throw new GenerateColumnParseException("");
6564
}
@@ -81,6 +80,49 @@ public ObGeneratedColumnSimpleFunc parse() throws GenerateColumnParseException {
8180
}
8281
}
8382

83+
private ObGeneratedColumnSimpleFunc handleAbsFunction() throws GenerateColumnParseException {
84+
lexer.nextToken(); // Consume LPAREN
85+
86+
// handle abs(T) or abs(`T`)
87+
if (lexer.token() == IDENTIFIER) {
88+
String refColumn = lexer.stringVal();
89+
lexer.nextToken(); // Consume the identifier
90+
91+
// check next token is RPAREN or not
92+
if (lexer.token() != RPAREN) {
93+
throw new GenerateColumnParseException(
94+
"Expected closing parenthesis after ABS argument");
95+
}
96+
lexer.nextToken(); // Consume RPAREN
97+
return new ObGeneratedColumnAbsFunc(refColumn);
98+
} else if (lexer.token() == BACKTICK) { // abs(`T`)
99+
lexer.nextToken(); // Consume BACKTICK
100+
if (lexer.token() == IDENTIFIER) {
101+
String refColumn = lexer.stringVal();
102+
lexer.nextToken(); // Consume the identifier
103+
104+
if (lexer.token() != BACKTICK) {
105+
throw new GenerateColumnParseException(
106+
"Expected closing backtick after identifier");
107+
}
108+
lexer.nextToken(); // Consume BACKTICK
109+
110+
if (lexer.token() != RPAREN) {
111+
throw new GenerateColumnParseException(
112+
"Expected closing parenthesis after ABS argument");
113+
}
114+
lexer.nextToken(); // Consume RPAREN
115+
return new ObGeneratedColumnAbsFunc(refColumn);
116+
} else {
117+
throw new GenerateColumnParseException(
118+
"Invalid argument for ABS function: expected IDENTIFIER after backtick");
119+
}
120+
} else {
121+
throw new GenerateColumnParseException(
122+
"Invalid argument for ABS function: expected IDENTIFIER or BACKTICK enclosed identifier");
123+
}
124+
}
125+
84126
protected void listParameters(ObGeneratedColumnSimpleFunc func) {
85127
List<Object> args = new ArrayList<Object>();
86128
args.add(primaryParameters());

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/parser/ObGeneratedColumnFuncName.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Map;
2222

2323
public enum ObGeneratedColumnFuncName {
24-
UNKNOWN("unknown"), SUB_STR("substr");
24+
UNKNOWN("unknown"), SUB_STR("substr"), ABS("abs");
2525

2626
public final String name;
2727

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/parser/ObGeneratedColumnSimpleToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
public enum ObGeneratedColumnSimpleToken {
2121

22-
COMMA(","), LPAREN("("), RPAREN(")"), SUB("-"), PLUS("+"), LITERAL_HEX, LITERAL_FLOAT, LITERAL_INT, IDENTIFIER, ERROR, EOF;
22+
COMMA(","), LPAREN("("), RPAREN(")"), SUB("-"), PLUS("+"), BACKTICK("`"), LITERAL_HEX, LITERAL_FLOAT, LITERAL_INT, IDENTIFIER, ERROR, EOF;
2323

2424
public final String name;
2525

0 commit comments

Comments
 (0)