docs: public static QueryCriterion deserialize(String statement){
          char [] delimeter = {' ', '\t', ',', '[', ']'};
          List<String> cmdList = splitStringByDelimeters(statement, delimeter, true);
          List<String> tokenList = filterDelimeterElement(cmdList, delimeter);
          if(tokenList.size() == 1){
              String key = cmdList.get(0);
              if(! key.isEmpty()){
                  return new ContainQueryCriterion(key);
              }
          } else if(tokenList.size() == 2){
              String cmd = cmdList.get(0);
              String key = cmdList.get(1);
              if(! key.isEmpty() && cmd.equals("not")){
                  return new NotContainQueryCriterion(key);
              }
          } else {
              String key = tokenList.get(0);
              String op = tokenList.get(1);
              if(op.equals("not")){
                  op = op + " " + tokenList.get(2);
              }
  
              if(op.equals("equals")){
                  String value = unescapeString(tokenList.get(2));
                  if(value != null){
                      return new EqualQueryCriterion(key, value);
                  }
              } else if(op.equals("not equals")){
                  String value = unescapeString(tokenList.get(3));
                  if(value != null){
                      return new NotEqualQueryCriterion(key, value);
                  }
              } else if(op.equals("matches")){
                  String value = unescapeString(tokenList.get(2));
                  if(value != null){
                      return new PatternQueryCriterion(key, value);
                  }
              } else if(op.equals("in")){
                  List<String> values = new ArrayList<String>();
                  boolean start = false;
                  for(String s : cmdList){
                      if(s.isEmpty() || s.equals(",")){
                          continue;
                      } else if(s.equals("[")){
                          start = true;
                          continue;
                      } else if(s.equals("]")){
                          start = false;
                          break;
                      } else if(start){
                          String v = unescapeString(s);
                          if(v != null){
                              values.add(v);
                          }
                      }
                  }
                  return new InQueryCriterion(key, values);
              } else if(op.equals("not in")){
                  List<String> values = new ArrayList<String>();
                  boolean start = false;
                  for(String s : cmdList){
                      if(s.isEmpty() || s.equals(',')){
                          break;
                      } else if(s.equals('[')){
                          start = true;
                          continue;
                      } else if(s.equals(']')){
                          start = false;
                          break;
                      } else if(start){
                          String v = unescapeString(s);
                          if(v != null){
                              values.add(v);
                          }
  
                      }
                  }
                  return new NotInQueryCriterion(key, values);
              }
          }
          return null;
      }