use of org.finos.legend.engine.plan.execution.cache.graphFetch.GraphFetchCacheByTargetCrossKeys in project legend-engine by finos.
the class TestPlanExecutionWithGraphFetchCrossKeyCache method testCrossCacheWithNoPropertyAccess.
@Test
public void testCrossCacheWithNoPropertyAccess() throws JavaCompileException {
String fetchFunction = "###Pure\n" + "function test::fetch(): String[1]\n" + "{\n" + " test::Person.all()\n" + " ->graphFetch(#{\n" + " test::Person {\n" + " fullName\n" + " }\n" + " }#, 1)\n" + " ->serialize(#{\n" + " test::Person {\n" + " fullName\n" + " }\n" + " }#)\n" + "}";
SingleExecutionPlan plan = buildPlanForFetchFunction(fetchFunction);
GraphFetchCacheByTargetCrossKeys firmCache = getFirmEmptyCache(plan);
PlanExecutionContext context = new PlanExecutionContext(plan, firmCache);
String expectedRes = "[" + "{\"fullName\":\"P1\"}," + "{\"fullName\":\"P2\"}," + "{\"fullName\":\"P3\"}," + "{\"fullName\":\"P4\"}," + "{\"fullName\":\"P5\"}" + "]";
Assert.assertEquals(expectedRes, executePlan(plan, context));
assertCacheStats(firmCache.getExecutionCache(), 0, 0, 0, 0);
}
use of org.finos.legend.engine.plan.execution.cache.graphFetch.GraphFetchCacheByTargetCrossKeys in project legend-engine by finos.
the class TestPlanExecutionWithGraphFetchCrossKeyCache method testMultiCrossPropertyCaches.
@Test
public void testMultiCrossPropertyCaches() throws JavaCompileException {
String fetchFunction = "###Pure\n" + "function test::fetch(): String[1]\n" + "{\n" + " test::Person.all()\n" + " ->graphFetch(#{\n" + " test::Person {\n" + " fullName,\n" + " firm {\n" + " name\n" + " },\n" + " address {\n" + " name\n" + " }\n" + " }\n" + " }#, 1)\n" + " ->serialize(#{\n" + " test::Person {\n" + " fullName,\n" + " firm {\n" + " name\n" + " },\n" + " address {\n" + " name\n" + " }\n" + " }\n" + " }#)\n" + "}";
SingleExecutionPlan plan = buildPlanForFetchFunction(fetchFunction);
GraphFetchCacheByTargetCrossKeys firmCache = getFirmEmptyCache(plan);
GraphFetchCacheByTargetCrossKeys addressCache = getAddressCache(plan);
PlanExecutionContext context = new PlanExecutionContext(plan, firmCache, addressCache);
String expectedRes = "[" + "{\"fullName\":\"P1\",\"firm\":{\"name\":\"F1\"},\"address\":{\"name\":\"A1\"}}," + "{\"fullName\":\"P2\",\"firm\":{\"name\":\"F2\"},\"address\":{\"name\":\"A2\"}}," + "{\"fullName\":\"P3\",\"firm\":null,\"address\":null}," + "{\"fullName\":\"P4\",\"firm\":null,\"address\":{\"name\":\"A3\"}}," + "{\"fullName\":\"P5\",\"firm\":{\"name\":\"F1\"},\"address\":{\"name\":\"A1\"}}" + "]";
Assert.assertEquals(expectedRes, executePlan(plan, context));
assertCacheStats(firmCache.getExecutionCache(), 3, 5, 2, 3);
assertCacheStats(addressCache.getExecutionCache(), 4, 5, 1, 4);
Assert.assertEquals(expectedRes, executePlan(plan, context));
assertCacheStats(firmCache.getExecutionCache(), 3, 10, 7, 3);
assertCacheStats(addressCache.getExecutionCache(), 4, 10, 6, 4);
}
use of org.finos.legend.engine.plan.execution.cache.graphFetch.GraphFetchCacheByTargetCrossKeys in project legend-engine by finos.
the class TestPlanExecutionWithGraphFetchCrossKeyCache method testToManyCrossPropertyCache.
@Test
public void testToManyCrossPropertyCache() throws JavaCompileException {
String fetchFunction = "###Pure\n" + "function test::fetch(): String[1]\n" + "{\n" + " test::Address.all()\n" + " ->graphFetch(#{\n" + " test::Address {\n" + " name,\n" + " persons {\n" + " fullName\n" + " }\n" + " }\n" + " }#, 1)\n" + " ->serialize(#{\n" + " test::Address {\n" + " name,\n" + " persons {\n" + " fullName\n" + " }\n" + " }\n" + " }#)\n" + "}";
SingleExecutionPlan plan = buildPlanForFetchFunction(fetchFunction);
GraphFetchCacheByTargetCrossKeys personCache = getPersonCache(plan);
PlanExecutionContext context = new PlanExecutionContext(plan, personCache);
String expectedRes = "[" + "{\"name\":\"A1\",\"persons\":[{\"fullName\":\"P1\"},{\"fullName\":\"P5\"}]}," + "{\"name\":\"A2\",\"persons\":[{\"fullName\":\"P2\"}]}," + "{\"name\":\"A3\",\"persons\":[{\"fullName\":\"P4\"}]}," + "{\"name\":\"A4\",\"persons\":[]}," + "{\"name\":\"A5\",\"persons\":[]}" + "]";
Assert.assertEquals(expectedRes, executePlan(plan, context));
assertCacheStats(personCache.getExecutionCache(), 5, 5, 0, 5);
Assert.assertEquals(expectedRes, executePlan(plan, context));
assertCacheStats(personCache.getExecutionCache(), 5, 10, 5, 5);
}
use of org.finos.legend.engine.plan.execution.cache.graphFetch.GraphFetchCacheByTargetCrossKeys in project legend-engine by finos.
the class TestPlanExecutionWithGraphFetchCrossKeyCache method testCrossPropertyCachingWithSerializableCache.
@Test
public void testCrossPropertyCachingWithSerializableCache() throws JavaCompileException, IOException, ClassNotFoundException {
String fetchFunction = "###Pure\n" + "function test::fetch(): String[1]\n" + "{\n" + " test::Person.all()\n" + " ->graphFetch(#{\n" + " test::Person {\n" + " fullName,\n" + " firm {\n" + " name,\n" + " address {\n" + " name\n" + " }\n" + " }\n" + " }\n" + " }#, 1)\n" + " ->serialize(#{\n" + " test::Person {\n" + " fullName,\n" + " firm {\n" + " name,\n" + " address {\n" + " name\n" + " }\n" + " }\n" + " }\n" + " }#)\n" + "}";
String expectedRes = "[" + "{\"fullName\":\"P1\",\"firm\":{\"name\":\"F1\",\"address\":{\"name\":\"A4\"}}}," + "{\"fullName\":\"P2\",\"firm\":{\"name\":\"F2\",\"address\":{\"name\":\"A3\"}}}," + "{\"fullName\":\"P3\",\"firm\":null}," + "{\"fullName\":\"P4\",\"firm\":null}," + "{\"fullName\":\"P5\",\"firm\":{\"name\":\"F1\",\"address\":{\"name\":\"A4\"}}}" + "]";
SingleExecutionPlan plan = buildPlanForFetchFunction(fetchFunction);
EngineJavaCompiler compiler = JavaHelper.compilePlan(plan, null);
GraphFetchCrossAssociationKeys graphFetchCrossAssociationKeys = GraphFetchCrossAssociationKeys.graphFetchCrossAssociationKeysForPlan(plan).stream().filter(x -> x.getName().equals("<default, root.firm>")).findFirst().orElse(null);
try (JavaHelper.ThreadContextClassLoaderScope ignored = JavaHelper.withCurrentThreadContextClassLoader(compiler.getClassLoader())) {
Map<GraphFetchCacheKey, List<Object>> firmMap1 = Maps.mutable.empty();
GraphFetchCacheByTargetCrossKeys firmCache1 = ExecutionCacheBuilder.buildGraphFetchCacheByTargetCrossKeysFromExecutionCache(buildExecutionCacheFromMap(firmMap1), graphFetchCrossAssociationKeys);
Assert.assertEquals(expectedRes, executePlan(plan, new PlanExecutionContext(firmCache1)));
assertCacheStats(firmCache1.getExecutionCache(), 3, 5, 2, 3);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(firmMap1);
objectOutputStream.flush();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ClassLoaderObjectInputStream objectInputStream = new ClassLoaderObjectInputStream(compiler.getClassLoader(), byteArrayInputStream);
Object o = objectInputStream.readObject();
@SuppressWarnings("unchecked") Map<GraphFetchCacheKey, List<Object>> firmMap2 = (Map<GraphFetchCacheKey, List<Object>>) o;
GraphFetchCacheByTargetCrossKeys firmCache2 = ExecutionCacheBuilder.buildGraphFetchCacheByTargetCrossKeysFromExecutionCache(buildExecutionCacheFromMap(firmMap2), graphFetchCrossAssociationKeys);
Assert.assertEquals(expectedRes, executePlan(plan, new PlanExecutionContext(firmCache2)));
assertCacheStats(firmCache2.getExecutionCache(), 3, 5, 5, 0);
}
}
use of org.finos.legend.engine.plan.execution.cache.graphFetch.GraphFetchCacheByTargetCrossKeys in project legend-engine by finos.
the class ExecutionNodeExecutor method findGraphFetchCacheByTargetCrossKeys.
private ExecutionCache<GraphFetchCacheKey, List<Object>> findGraphFetchCacheByTargetCrossKeys(GlobalGraphFetchExecutionNode globalGraphFetchExecutionNode) {
List<GraphFetchCache> graphFetchCaches = this.executionState.graphFetchCaches;
XStorePropertyFetchDetails fetchDetails = globalGraphFetchExecutionNode.xStorePropertyFetchDetails;
return graphFetchCaches.stream().filter(GraphFetchCacheByTargetCrossKeys.class::isInstance).map(GraphFetchCacheByTargetCrossKeys.class::cast).filter(cache -> cache.getGraphFetchCrossAssociationKeys() != null).filter(cache -> {
GraphFetchCrossAssociationKeys c = cache.getGraphFetchCrossAssociationKeys();
return c.getPropertyPath().equals(fetchDetails.propertyPath) && c.getSourceMappingId().equals(fetchDetails.sourceMappingId) && c.getSourceSetId().equals(fetchDetails.sourceSetId) && c.getTargetMappingId().equals(fetchDetails.targetMappingId) && c.getTargetSetId().equals(fetchDetails.targetSetId) && c.getTargetPropertiesOrdered().equals(fetchDetails.targetPropertiesOrdered) && c.getSubTree().equals(fetchDetails.subTree);
}).map(GraphFetchCacheByTargetCrossKeys::getExecutionCache).findFirst().orElse(null);
}
Aggregations