diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c8935 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ \ No newline at end of file diff --git a/builder/README.md b/builder/README.md index d5f6285..2d555ff 100644 --- a/builder/README.md +++ b/builder/README.md @@ -77,8 +77,9 @@ operators supported: * != * <> * in -* not in` +* not in * like +* not like * between * not between diff --git a/builder/builder.go b/builder/builder.go index 6cc90c7..b5a3b72 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -249,6 +249,7 @@ const ( opLt = "<" opLte = "<=" opLike = "like" + opNotLike = "not like" opBetween = "between" opNotBetween = "not between" // special @@ -310,12 +311,15 @@ var op2Comparable = map[string]compareProducer{ opLike: func(m map[string]interface{}) (Comparable, error) { return Like(m), nil }, + opNotLike: func(m map[string]interface{}) (Comparable, error) { + return NotLike(m), nil + }, opNull: func(m map[string]interface{}) (Comparable, error) { return nullCompareble(m), nil }, } -var opOrder = []string{opEq, opIn, opNe1, opNe2, opNotIn, opGt, opGte, opLt, opLte, opLike, opBetween, opNotBetween, opNull} +var opOrder = []string{opEq, opIn, opNe1, opNe2, opNotIn, opGt, opGte, opLt, opLte, opLike, opNotLike, opBetween, opNotBetween, opNull} func buildWhereCondition(mapSet *whereMapSet) ([]Comparable, func(), error) { cpArr, release := getCpPool() @@ -379,10 +383,28 @@ func splitKey(key string) (field string, operator string, err error) { } else { field = key[:idx] operator = strings.Trim(key[idx+1:], " ") + operator = removeInnerSpace(operator) } return } +func removeInnerSpace(operator string) string { + n := len(operator) + firstSpace := strings.IndexByte(operator, ' ') + if firstSpace == -1 { + return operator + } + lastSpace := firstSpace + for i := firstSpace+1; i