ShardingSphere 解析Groovy表规则表达式

969 阅读1分钟

org.apache.shardingsphere.core.util.InlineExpressionParser

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.4.7</version>
            <classifier>indy</classifier>
        </dependency>
    @Test
    public void groovyTest() {
        GroovyShell groovyShell = new GroovyShell();
        Object evaluate = groovyShell.evaluate("[1..12]");
        System.out.println(evaluate);
        Script parse = groovyShell.parse("(1..12).collect {t -> t.toString().padLeft(2,'0')}");
        Object run = parse.run();
        System.out.println(run);
        IntRange integers = new IntRange(1,12);
        Iterator<Integer> toInt = integers.iterator();
        while (toInt.hasNext()) {
            System.out.println(toInt.next());
        }
    }
    private List<String> flatten(final List<Object> segments) {
        List<String> result = new ArrayList<>();
        for (Object each : segments) {
            if (each instanceof GString) {
                result.addAll(assemblyCartesianSegments((GString) each));
            } else {
                result.add(each.toString());
            }
        }
        return result;
    }
    
    
        private List<String> assemblyCartesianSegments(final GString segment) {
        Set<List<String>> cartesianValues = getCartesianValues(segment);
        List<String> result = new ArrayList<>(cartesianValues.size());
        for (List<String> each : cartesianValues) {
            result.add(assemblySegment(each, segment));
        }
        return result;
    }
    
    
        private Set<List<String>> getCartesianValues(final GString segment) {
        List<Set<String>> result = new ArrayList<>(segment.getValues().length);
        for (Object each : segment.getValues()) {
            if (null == each) {
                continue;
            }
            if (each instanceof Collection) {
                result.add(Sets.newLinkedHashSet(Collections2.transform((Collection<Object>) each, new Function<Object, String>() {
                    
                    @Override
                    public String apply(final Object input) {
                        return input.toString();
                    }
                })));
            } else {
                result.add(Sets.newHashSet(each.toString()));
            }
        }
        return Sets.cartesianProduct(result);
    }
    
    
        private String assemblySegment(final List<String> cartesianValue, final GString segment) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < segment.getStrings().length; i++) {
            result.append(segment.getStrings()[i]);
            if (i < cartesianValue.size()) {
                result.append(cartesianValue.get(i));
            }
        }
        return result.toString();
    }
    

groovyShell的evaluate和parse的区别是,parse会提前编译为Script进行缓存,执行run方法才开始解析。而evaluate是直接解析出结果。