class OperatorLike extends Operator {
    public OperatorLike(String name) {
        this.name = name;
    }

    @Override
    public Object executeInner(Object[] list) throws Exception {
        return executeInner(list[0], list[1]);
    }

    public Object executeInner(Object op1, Object op2) throws Exception {
        if (op1 == null && op2 == null) {
            return true;
        }
        if (op1 == null || op2 == null) {
            return false;
        }
        String s = op1.toString();
        String pattern = op2.toString();

        return matchPattern(s, pattern);
    }

    protected static boolean matchPattern(String s, String pattern) {<FILL_FUNCTION_BODY>}
}

        int sPointer = 0, pPointer = 0;
        int sLen = s.length(), pLen = pattern.length();
        int sRecall = -1, pRecall = -1;
        while (sPointer < sLen) {
            if (pPointer < pLen && (s.charAt(sPointer) == pattern.charAt(pPointer))) {
                sPointer++;
                pPointer++;
            } else if (pPointer < pLen && pattern.charAt(pPointer) == '%') {
                sRecall = sPointer;
                pRecall = pPointer;
                pPointer++;
            } else if (sRecall >= 0) {
                sPointer = ++sRecall;
                pPointer = pRecall + 1;
            } else {
                return false;
            }
        }
        while (pPointer < pLen && pattern.charAt(pPointer) == '%') {
            pPointer++;
        }
        return pPointer == pLen;
    
<methods>public non-sealed void <init>() ,public static int compareData(java.lang.Object, java.lang.Object) throws java.lang.Exception,public com.ql.util.express.OperateData executeInner(com.ql.util.express.InstructionSetContext, com.ql.util.express.ArraySwap) throws java.lang.Exception,public abstract java.lang.Object executeInner(java.lang.Object[]) throws java.lang.Exception,public static boolean objectEquals(java.lang.Object, java.lang.Object) <variables>