Skip to content

Commit ec26072

Browse files
committed
support presto-0.152
1 parent b654d46 commit ec26072

23 files changed

+164
-230
lines changed

README-en.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ It will generate presto-third-functions-{version}-shaded.jar in target directory
2424

2525
You can also directly download file from [release page](https://github.com/aaronshan/presto-third-functions/releases).
2626

27-
> current last version is `0.3.0`, support `presto-0.150+`, If you presto's version <`0.150`, please use `0.2.0`.
27+
### version description
28+
| version | description |
29+
|:--|:--|
30+
| `0.2.0` | support `presto-0.147`~`presto-0.149`|
31+
| `0.3.0` | support `presto-0.150`~`presto-0.151`|
32+
| `0.4.0` | support `presto-0.152`|
2833

2934
## functions
3035

@@ -43,7 +48,7 @@ You can also directly download file from [release page](https://github.com/aaron
4348

4449
> I had already proposed a [pull request](https://github.com/prestodb/presto/pull/5644#event-729329053) about `array_union`. Currently, it be merged to presto master branch. So, If your presto version > 0.151, it already include array_union function.
4550
46-
To support `presto-0.150+`, `0.3.0` rename `array_union` to `arr_union`
51+
To support `presto-0.150+`, from `0.3.0`, it had rename to `arr_union`
4752

4853
### 3. date functions
4954
| function| description |

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Java 8 Update 60 及以上
1111
* Maven 3.3.9+
1212

13-
### 命令:
13+
### 命令
1414
```
1515
cd ${project_home}
1616
mvn clean package
@@ -24,7 +24,12 @@ mvn clean package -DskipTests
2424

2525
或者也可以直接在[发布页](https://github.com/aaronshan/presto-third-functions/releases)下载.
2626

27-
> 当前最新版本为`0.3.0`, 支持`presto-0.150+`,如果你使用的presto版本低于`0.150`,继续使用`0.2.0`即可。
27+
### 版本说明
28+
| 版本 | 说明 |
29+
|:--|:--|
30+
| `0.2.0` | 支持`presto-0.147`~`presto-0.149`|
31+
| `0.3.0` | 支持`presto-0.150`~`presto-0.151`|
32+
| `0.4.0` | 支持`presto-0.152`|
2833

2934
## 函数
3035
### 1. 字符串相关函数
@@ -50,7 +55,7 @@ mvn clean package -DskipTests
5055

5156
> 我已经发起了一个`array_union`[PR](https://github.com/prestodb/presto/pull/5644#event-729329053), 现在它已经被合并到presto的master分支中. 因此,如果你的presto版本 > 0.151,它已经包含了`array_union`函数.
5257
53-
`0.3.0`版本为了兼容`presto-0.150`版本,也为了防止和`presto-0.151+`命名冲突,将该方法改名为arr_union
58+
`0.3.0`版本以后为了兼容`presto-0.150`版本,也为了防止和`presto-0.151+`命名冲突,将该方法改名为arr_union
5459

5560
### 4. JSON相关函数
5661
| 函数| 说明|

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
<groupId>cc.shanruifeng</groupId>
88
<artifactId>presto-third-functions</artifactId>
9-
<version>0.3.0</version>
9+
<version>0.4.0</version>
1010

1111
<properties>
1212
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1313
<project.build.targetJdk>1.8</project.build.targetJdk>
1414
<project.report.outputEncoding>UTF-8</project.report.outputEncoding>
1515
<project.report.inputEncoding>UTF-8</project.report.inputEncoding>
1616

17-
<presto.version>0.150</presto.version>
17+
<presto.version>0.152</presto.version>
1818
<pinyin4j.version>2.5.0</pinyin4j.version>
1919
<commons-codec.version>1.10</commons-codec.version>
2020
<junit.version>4.12</junit.version>

src/main/java/cc/shanruifeng/functions/udfs/UdfFactory.java

Lines changed: 0 additions & 123 deletions
This file was deleted.
Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,68 @@
11
package cc.shanruifeng.functions.udfs;
22

3-
import com.facebook.presto.metadata.FunctionFactory;
43
import com.facebook.presto.spi.Plugin;
5-
import com.facebook.presto.spi.type.TypeManager;
6-
import com.google.common.base.Preconditions;
7-
import com.google.common.collect.ImmutableList;
8-
9-
import javax.inject.Inject;
4+
import com.google.common.collect.ImmutableSet;
5+
import com.google.common.collect.Lists;
6+
import com.google.common.collect.Sets;
7+
import java.io.FileInputStream;
8+
import java.io.IOException;
9+
import java.net.URL;
1010
import java.util.List;
11-
import java.util.Map;
11+
import java.util.Set;
12+
import java.util.zip.ZipEntry;
13+
import java.util.zip.ZipInputStream;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1216

1317
/**
1418
* @author ruifeng.shan
1519
* @date 2016-07-06
1620
* @time 18:39
1721
*/
1822
public class UdfPlugin implements Plugin {
19-
TypeManager typeManager;
23+
private static Logger logger = LoggerFactory.getLogger(UdfPlugin.class);
2024

21-
@Inject
22-
public void setTypeManager(TypeManager typeManager) {
23-
this.typeManager = Preconditions.checkNotNull(typeManager, "typeManager is null");
24-
}
25+
private List<Class<?>> getFunctionClasses() throws IOException {
26+
List<Class<?>> classes = Lists.newArrayList();
27+
String classResource = this.getClass().getName().replace(".", "/") + ".class";
28+
String jarURLFile = Thread.currentThread().getContextClassLoader().getResource(classResource).getFile();
29+
int jarEnd = jarURLFile.indexOf('!');
30+
String jarLocation = jarURLFile.substring(0, jarEnd); // This is in URL format, convert once more to get actual file location
31+
jarLocation = new URL(jarLocation).getFile();
2532

26-
public void setOptionalConfig(Map<String, String> optionalConfig) {
33+
ZipInputStream zip = new ZipInputStream(new FileInputStream(jarLocation));
34+
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
35+
if (entry.getName().endsWith(".class") && !entry.isDirectory()) {
36+
String className = entry.getName().replace("/", "."); // This still has .class at the end
37+
className = className.substring(0, className.length() - 6); // remvove .class from end
38+
try {
39+
classes.add(Class.forName(className));
40+
} catch (ClassNotFoundException e) {
41+
logger.error("Could not load class {}, Exception: {}", className, e);
42+
}
43+
}
44+
}
45+
return classes;
2746
}
2847

29-
public <T> List<T> getServices(Class<T> type) {
30-
if (type == FunctionFactory.class) {
31-
return ImmutableList.of(type.cast(new UdfFactory(typeManager)));
48+
@Override
49+
public Set<Class<?>> getFunctions() {
50+
try {
51+
List<Class<?>> classes = getFunctionClasses();
52+
Set<Class<?>> set = Sets.newHashSet();
53+
for (Class<?> clazz : classes) {
54+
logger.info("Adding: " + clazz);
55+
if (clazz.getName().startsWith("cc.shanruifeng.functions.udfs.scalar")
56+
|| clazz.getName().startsWith("cc.shanruifeng.functions.udfs.aggregation")
57+
|| clazz.getName().startsWith("cc.shanruifeng.functions.udfs.window")) {
58+
set.add(clazz);
59+
}
60+
}
61+
return ImmutableSet.<Class<?>>builder().addAll(set).build();
62+
} catch (IOException e) {
63+
logger.error("Could not load classes from jar file: {} ", e);
64+
return ImmutableSet.of();
3265
}
3366

34-
return ImmutableList.of();
3567
}
3668
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cc.shanruifeng.functions.udfs.model;
2+
3+
/**
4+
* @author ruifeng.shan
5+
* @date 2017-01-09
6+
* @time 18:56
7+
*/
8+
public enum DayType {
9+
HOLIDAY("holiday"), WORKDAY("workday");
10+
11+
private String code;
12+
private DayType(String code) {
13+
this.code = code;
14+
}
15+
16+
public String getCode() {
17+
return this.code;
18+
}
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cc.shanruifeng.functions.udfs.model;
2+
3+
/**
4+
* @author ruifeng.shan
5+
* @date 2017-01-09
6+
* @time 19:00
7+
*/
8+
public enum Language {
9+
CN, EN
10+
}

src/main/java/cc/shanruifeng/functions/udfs/scalar/IsNullFunctions.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package cc.shanruifeng.functions.udfs.scalar;
22

3-
import com.facebook.presto.operator.Description;
4-
import com.facebook.presto.operator.scalar.annotations.ScalarFunction;
5-
import com.facebook.presto.operator.scalar.annotations.TypeParameter;
63
import com.facebook.presto.spi.block.Block;
4+
import com.facebook.presto.spi.function.Description;
5+
import com.facebook.presto.spi.function.ScalarFunction;
6+
import com.facebook.presto.spi.function.SqlType;
7+
import com.facebook.presto.spi.function.TypeParameter;
78
import com.facebook.presto.spi.type.StandardTypes;
8-
import com.facebook.presto.type.SqlType;
99
import io.airlift.slice.Slice;
1010

1111
import javax.annotation.Nullable;

src/main/java/cc/shanruifeng/functions/udfs/scalar/array/ArrayUnionFunction.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package cc.shanruifeng.functions.udfs.scalar.array;
22

3-
import com.facebook.presto.operator.Description;
43
import com.facebook.presto.operator.aggregation.TypedSet;
5-
import com.facebook.presto.operator.scalar.annotations.ScalarFunction;
6-
import com.facebook.presto.operator.scalar.annotations.TypeParameter;
74
import com.facebook.presto.spi.block.Block;
85
import com.facebook.presto.spi.block.BlockBuilder;
96
import com.facebook.presto.spi.block.BlockBuilderStatus;
7+
import com.facebook.presto.spi.function.Description;
8+
import com.facebook.presto.spi.function.ScalarFunction;
9+
import com.facebook.presto.spi.function.SqlType;
10+
import com.facebook.presto.spi.function.TypeParameter;
1011
import com.facebook.presto.spi.type.Type;
11-
import com.facebook.presto.type.SqlType;
1212
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
1313
import it.unimi.dsi.fastutil.longs.LongSet;
1414

src/main/java/cc/shanruifeng/functions/udfs/scalar/array/ArrayValueCountFunction.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package cc.shanruifeng.functions.udfs.scalar.array;
22

3-
import com.facebook.presto.operator.Description;
4-
import com.facebook.presto.operator.scalar.annotations.OperatorDependency;
5-
import com.facebook.presto.operator.scalar.annotations.ScalarFunction;
6-
import com.facebook.presto.operator.scalar.annotations.TypeParameter;
73
import com.facebook.presto.spi.PrestoException;
84
import com.facebook.presto.spi.StandardErrorCode;
95
import com.facebook.presto.spi.block.Block;
6+
import com.facebook.presto.spi.function.Description;
7+
import com.facebook.presto.spi.function.OperatorDependency;
8+
import com.facebook.presto.spi.function.ScalarFunction;
9+
import com.facebook.presto.spi.function.SqlType;
10+
import com.facebook.presto.spi.function.TypeParameter;
1011
import com.facebook.presto.spi.type.StandardTypes;
1112
import com.facebook.presto.spi.type.Type;
12-
import com.facebook.presto.type.SqlType;
1313
import com.google.common.base.Throwables;
1414
import io.airlift.slice.Slice;
1515

1616
import javax.annotation.Nullable;
1717
import java.lang.invoke.MethodHandle;
1818

19-
import static com.facebook.presto.metadata.OperatorType.EQUAL;
19+
import static com.facebook.presto.spi.function.OperatorType.EQUAL;
2020

2121
/**
2222
* @author ruifeng.shan

0 commit comments

Comments
 (0)