[ 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)