class MatchPrinter {

    private MatchPrinter() {}

    public static void printMatchPredicate(Function matchPredicate, Style style, StringBuilder sb) {
        List<Symbol> arguments = matchPredicate.arguments();
        sb.append("MATCH((");
        printColumns(arguments.get(0), sb);
        sb.append("), ");
        // second argument (keyword)
        sb.append(arguments.get(1).toString(style));
        sb.append(") USING ");
        // third argument (method)
        // need to print as identifier without quotes
        sb.append((String) ((Literal<?>) arguments.get(2)).value());
        printProperties(arguments.get(3), sb);
    }

    @SuppressWarnings("unchecked")
    private static void printColumns(Symbol cols, StringBuilder sb) {
        // first argument (cols)
        var columnBootMap = (Map<String, Object>) ((Literal<?>) cols).value();
        Iterator<Map.Entry<String, Object>> entryIterator = columnBootMap.entrySet().iterator();
        while (entryIterator.hasNext()) {
            Map.Entry<String, Object> entry = entryIterator.next();
            sb.append(entry.getKey());
            Object boost = entry.getValue();
            if (boost != null) {
                sb
                    .append(" ")
                    .append(boost);
            }
            if (entryIterator.hasNext()) {
                sb.append(", ");
            }
        }
    }

    private static void printProperties(Symbol propSymbol, StringBuilder sb) {<FILL_FUNCTION_BODY>}
}

        // fourth argument (properties)
        var properties = (Map<?, ?>) ((Literal<?>) propSymbol).value();
        if (properties.isEmpty()) {
            return;
        }
        sb.append(" WITH (");
        var it = properties.entrySet().iterator();
        while (it.hasNext()) {
            var entry = it.next();
            sb.append(entry.getKey()).append(" = ");
            Object value = entry.getValue();
            if (value != null) {
                sb.append("'");
                sb.append(value);
                sb.append("'");
            }
            if (it.hasNext()) {
                sb.append(", ");
            }
        }
        sb.append(")");
    
<no_super_class>