public boolean isLocalApplicable() {
        return joinMode.equals(BROADCAST) ||
                joinMode.equals(COLOCATE) ||
                joinMode.equals(LOCAL_HASH_BUCKET) ||
                joinMode.equals(SHUFFLE_HASH_BUCKET) ||
                joinMode.equals(REPLICATED);
    }
@Test
    public void testIsLocalApplicable() throws IOException {
        ConnectContext ctx = UtFrameUtils.createDefaultCtx();
        Object[][] testCases = new Object[][]{
                {JoinNode.DistributionMode.BROADCAST, true},
                {JoinNode.DistributionMode.COLOCATE, true},
                {JoinNode.DistributionMode.LOCAL_HASH_BUCKET, true},
                {JoinNode.DistributionMode.SHUFFLE_HASH_BUCKET, true},
                {JoinNode.DistributionMode.PARTITIONED, false},
                {JoinNode.DistributionMode.REPLICATED, true},
        };

        for (Object[] tc : testCases) {
            JoinNode.DistributionMode joinMode = (JoinNode.DistributionMode) tc[0];
            Boolean expect = (Boolean) tc[1];
            RuntimeFilterDescription rf = new RuntimeFilterDescription(ctx.getSessionVariable());
            rf.setJoinMode(joinMode);
            Assert.assertEquals(rf.isLocalApplicable(), expect);
        }
    }