Skip to content

Commit

Permalink
TEIID-4810 adding a simple caching feature to the delegator translator
Browse files Browse the repository at this point in the history
  • Loading branch information
shawkins committed Jun 28, 2018
1 parent c467cab commit 1e4cceb
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 4 deletions.
Expand Up @@ -21,6 +21,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Pattern;

import org.teiid.language.Argument;
import org.teiid.language.Call;
Expand Down Expand Up @@ -1040,6 +1041,12 @@ public void setSupportsOnlyLiteralComparison(boolean value) {
public CacheDirective getCacheDirective(Command command,
ExecutionContext executionContext, RuntimeMetadata metadata)
throws TranslatorException {
if (cachePattern != null && cachePattern.matcher(command.toString()).matches()) {
//return a new cache directive with defaults and ttl set
CacheDirective cacheDirective = new CacheDirective();
cacheDirective.setTtl(cacheTtl);
return cacheDirective;
}
return delegate.getCacheDirective(command, executionContext, metadata);
}

Expand Down Expand Up @@ -1477,4 +1484,27 @@ public void setSupportsOnlyTimestampAddLiteral(
boolean supportsOnlyTimestampAddLiteral) {
this.supportsOnlyTimestampAddLiteral = supportsOnlyTimestampAddLiteral;
}

private Pattern cachePattern;
@TranslatorProperty(display="Cache Pattern", advanced=true)
public String getCachePattern() {
if (this.cachePattern != null) {
return this.cachePattern.pattern();
}
return null;
}

public void setCachePattern(String cachePattern) {
this.cachePattern = Pattern.compile(cachePattern);
}

Long cacheTtl;
@TranslatorProperty(display="Cache TTL", advanced=true)
public Long getCacheTtl() {
return cacheTtl;
}

public void setCacheTtl(Long ttl) {
this.cacheTtl = ttl;
}
}
Expand Up @@ -34,7 +34,7 @@ public class TestBaseDelegatingExecutionFactory {
Method[] methods = ExecutionFactory.class.getDeclaredMethods();
Method[] proxyMethods = BaseDelegatingExecutionFactory.class.getDeclaredMethods();
//excluding the setter methods the counts should be equal
assertEquals(methods.length+84, proxyMethods.length);
assertEquals(methods.length+88, proxyMethods.length);
}

@Test public void testExecution() throws TranslatorException {
Expand Down
Expand Up @@ -259,6 +259,10 @@ public static String getTranslatorName(ExecutionFactory factory) {
}

public static VDBTranslatorMetaData buildTranslatorMetadata(ExecutionFactory factory, String moduleName) {
return buildTranslatorMetadata(factory, moduleName, true);
}

public static VDBTranslatorMetaData buildTranslatorMetadata(ExecutionFactory factory, String moduleName, boolean useNewInstance) {

org.teiid.translator.Translator translator = factory.getClass().getAnnotation(org.teiid.translator.Translator.class);
if (translator == null) {
Expand All @@ -277,7 +281,10 @@ public static VDBTranslatorMetaData buildTranslatorMetadata(ExecutionFactory fac
ExtendedPropertyMetadataList propertyDefns = new ExtendedPropertyMetadataList();

try {
Object instance = factory.getClass().newInstance();
Object instance = factory;
if (useNewInstance) {
instance = factory.getClass().newInstance();
}
buildTranslatorProperties(factory, metadata, propertyDefns, instance);
buildExtensionMetadataProperties(factory, metadata, propertyDefns, instance);
} catch (InstantiationException e) {
Expand Down
20 changes: 18 additions & 2 deletions runtime/src/main/java/org/teiid/runtime/EmbeddedServer.java
Expand Up @@ -45,6 +45,7 @@
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import javax.transaction.TransactionManager;
import javax.xml.stream.XMLStreamException;
Expand Down Expand Up @@ -666,7 +667,11 @@ public void addTranslator(String name, String type, Map<String, String> properti
*/
public void addTranslator(String name, ExecutionFactory<?, ?> ef) {
translators.put(name, ef);
VDBTranslatorMetaData vdbTranslatorMetaData = TranslatorUtil.buildTranslatorMetadata(ef, null);
VDBTranslatorMetaData vdbTranslatorMetaData = TranslatorUtil.buildTranslatorMetadata(ef, null, true);
if (vdbTranslatorMetaData != null) {
this.translatorRepository.addTranslatorMetadata(vdbTranslatorMetaData.getName(), vdbTranslatorMetaData);
}
vdbTranslatorMetaData = TranslatorUtil.buildTranslatorMetadata(ef, null, false);
if (vdbTranslatorMetaData != null) {
this.translatorRepository.addTranslatorMetadata(name, vdbTranslatorMetaData);
}
Expand Down Expand Up @@ -964,8 +969,19 @@ public ExecutionFactory<Object, Object> getExecutionFactory(String name)
throws ConnectorManagerException {
ExecutionFactory<?, ?> ef = translators.get(name);
if (ef == null) {
//map to the expected map
IdentityHashMap<org.teiid.adminapi.Translator, ExecutionFactory<Object, Object>> map = translators
.entrySet().stream()
.filter(e -> this.translatorRepository
.getTranslatorMetaData(e.getKey()) != null)
.collect(Collectors.toMap(
e -> (org.teiid.adminapi.Translator) this.translatorRepository
.getTranslatorMetaData(e.getKey()),
e -> (ExecutionFactory<Object, Object>) e
.getValue(),
(x, y) -> x, IdentityHashMap::new));
return TranslatorUtil.getExecutionFactory(name, this.translatorRepository, this.translatorRepository,
null, new IdentityHashMap<org.teiid.adminapi.Translator, ExecutionFactory<Object,Object>>(), new HashSet<String>());
null, map, new HashSet<String>());
}
return (ExecutionFactory<Object, Object>) ef;
}
Expand Down

0 comments on commit 1e4cceb

Please sign in to comment.