[
https://issues.apache.org/jira/browse/DRILL-4726?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15468340#comment-15468340
]
ASF GitHub Bot commented on DRILL-4726:
---------------------------------------
Github user paul-rogers commented on a diff in the pull request:
https://github.com/apache/drill/pull/574#discussion_r77704648
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillFunctionRegistry.java
---
@@ -218,4 +302,141 @@ private void
registerOperatorsWithoutInference(DrillOperatorTable operatorTable)
}
}
}
+
+ /**
+ * Function registry holder. Stores function implementations by jar
name, function name.
+ */
+ private class GenericRegistryHolder<T, U> {
+ private final ReadWriteLock readWriteLock = new
ReentrantReadWriteLock();
+ private final AutoCloseableLock readLock = new
AutoCloseableLock(readWriteLock.readLock());
+ private final AutoCloseableLock writeLock = new
AutoCloseableLock(readWriteLock.writeLock());
+
+ // jar name, Map<function name, List<signature>
+ private final Map<T, Map<T, List<T>>> jars;
+
+ // function name, Map<signature, function holder>
+ private final Map<T, Map<T, U>> functions;
+
+ public GenericRegistryHolder() {
+ this.functions = Maps.newHashMap();
+ this.jars = Maps.newHashMap();
+ }
+
+ public void addJar(T jName, Map<T, Pair<T, U>> sNameMap) {
+ try (AutoCloseableLock lock = writeLock.open()) {
+ Map<T, List<T>> map = jars.get(jName);
+ if (map != null) {
+ removeAllByJar(jName);
+ }
+ map = Maps.newHashMap();
+ jars.put(jName, map);
+
+ for (Entry<T, Pair<T, U>> entry : sNameMap.entrySet()) {
+ T sName = entry.getKey();
+ Pair<T, U> pair = entry.getValue();
+ addFunction(jName, pair.getKey(), sName, pair.getValue());
+ }
+ }
+ }
+
+ public void removeJar(T jName) {
+ try (AutoCloseableLock lock = writeLock.open()) {
+ removeAllByJar(jName);
+ }
+ }
+
+ public List<T> getAllJarNames() {
+ try (AutoCloseableLock lock = readLock.open()) {
+ return Lists.newArrayList(jars.keySet());
+ }
+ }
+
+ public List<T> getAllFunctionNames(T jName) {
+ try (AutoCloseableLock lock = readLock.open()){
+ Map<T, List<T>> map = jars.get(jName);
+ return map == null ? Lists.<T>newArrayList() :
Lists.newArrayList(map.keySet());
+ }
+ }
+
+ public ListMultimap<T, U> getAllFunctionsWithHolders() {
+ try (AutoCloseableLock lock = readLock.open()) {
+ ListMultimap<T, U> multimap = ArrayListMultimap.create();
+ for (Entry<T, Map<T, U>> entry : functions.entrySet()) {
+ multimap.putAll(entry.getKey(),
Lists.newArrayList(entry.getValue().values()));
+ }
+ return multimap;
+ }
+ }
+
+ public ListMultimap<T, T> getAllFunctionsWithSignatures() {
+ try (AutoCloseableLock lock = readLock.open()) {
+ ListMultimap<T, T> multimap = ArrayListMultimap.create();
+ for (Entry<T, Map<T, U>> entry : functions.entrySet()) {
+ multimap.putAll(entry.getKey(),
Lists.newArrayList(entry.getValue().keySet()));
+ }
+ return multimap;
+ }
+ }
+
+ public List<U> getHoldersByFunctionName(T fName) {
+ try (AutoCloseableLock lock = readLock.open()) {
+ Map<T, U> map = functions.get(fName);
+ return map == null ? Lists.<U>newArrayList() :
Lists.newArrayList(map.values());
+ }
+ }
+
+ public boolean containsJar(T jName) {
--- End diff --
How is this used? It is not thread-safe: we check if jar exists at time T,
but by the time we use the information at time T+1, some other thread mave
inserted the jar.
> Dynamic UDFs support
> --------------------
>
> Key: DRILL-4726
> URL: https://issues.apache.org/jira/browse/DRILL-4726
> Project: Apache Drill
> Issue Type: New Feature
> Affects Versions: 1.6.0
> Reporter: Arina Ielchiieva
> Assignee: Arina Ielchiieva
> Fix For: Future
>
>
> Allow register UDFs without restart of Drillbits.
> Design is described in document below:
> https://docs.google.com/document/d/1FfyJtWae5TLuyheHCfldYUpCdeIezR2RlNsrOTYyAB4/edit?usp=sharing
>
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)