PhysicalExec leftExec, PhysicalExec rightExec) throws IOException {
Enforcer enforcer = context.getEnforcer();
EnforceProperty property = getAlgorithmEnforceProperty(enforcer, plan);
if (property != null) {
JoinAlgorithm algorithm = property.getJoin().getAlgorithm();
switch (algorithm) {
case NESTED_LOOP_JOIN:
LOG.info("Join (" + plan.getPID() +") chooses [Nested Loop Join]");
return new NLJoinExec(context, plan, leftExec, rightExec);
case BLOCK_NESTED_LOOP_JOIN:
LOG.info("Join (" + plan.getPID() +") chooses [Block Nested Loop Join]");
return new BNLJoinExec(context, plan, leftExec, rightExec);
case IN_MEMORY_HASH_JOIN:
LOG.info("Join (" + plan.getPID() +") chooses [In-memory Hash Join]");
return new HashJoinExec(context, plan, leftExec, rightExec);
case MERGE_JOIN:
LOG.info("Join (" + plan.getPID() +") chooses [Sort Merge Join]");
return createMergeInnerJoin(context, plan, leftExec, rightExec);
case HYBRID_HASH_JOIN:
default:
LOG.error("Invalid Inner Join Algorithm Enforcer: " + algorithm.name());
LOG.error("Choose a fallback inner join algorithm: " + JoinAlgorithm.MERGE_JOIN.name());
return createMergeInnerJoin(context, plan, leftExec, rightExec);
}