COMPLEX SEARCH
This commit is contained in:
		
							
								
								
									
										83
									
								
								dbs/dbs.go
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								dbs/dbs.go
									
									
									
									
									
								
							@@ -1,9 +1,92 @@
 | 
			
		||||
package dbs
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Operator int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	LIKE Operator = iota
 | 
			
		||||
	EXISTS
 | 
			
		||||
	IN
 | 
			
		||||
	GTE
 | 
			
		||||
	LTE
 | 
			
		||||
	LT
 | 
			
		||||
	GT
 | 
			
		||||
	EQUAL
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var str = [...]string{
 | 
			
		||||
	"like",
 | 
			
		||||
	"exists",
 | 
			
		||||
	"in",
 | 
			
		||||
	"gte",
 | 
			
		||||
	"lte",
 | 
			
		||||
	"lt",
 | 
			
		||||
	"gt",
 | 
			
		||||
	"equal",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Operator) String() string {
 | 
			
		||||
	return str[m]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m Operator) ToMongoOperator() string {
 | 
			
		||||
	switch m {
 | 
			
		||||
	case LIKE:
 | 
			
		||||
		return "$regex"
 | 
			
		||||
	case EXISTS:
 | 
			
		||||
		return "$exists"
 | 
			
		||||
	case IN:
 | 
			
		||||
		return "$in"
 | 
			
		||||
	case GTE:
 | 
			
		||||
		return "$gte"
 | 
			
		||||
	case GT:
 | 
			
		||||
		return "$gt"
 | 
			
		||||
	case LTE:
 | 
			
		||||
		return "$lte"
 | 
			
		||||
	case LT:
 | 
			
		||||
		return "$lt"
 | 
			
		||||
	case EQUAL:
 | 
			
		||||
		return "$match"
 | 
			
		||||
	default:
 | 
			
		||||
		return "$regex"
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func StringToOperator(s string) Operator {
 | 
			
		||||
	for i, v := range str {
 | 
			
		||||
		if v == s {
 | 
			
		||||
			return Operator(i)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return LIKE
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ToValueOperator(operator Operator, value interface{}) interface{} {
 | 
			
		||||
	if strings.TrimSpace(fmt.Sprintf("%v", value)) == "*" {
 | 
			
		||||
		value = ""
 | 
			
		||||
	}
 | 
			
		||||
	if operator == LIKE {
 | 
			
		||||
		return "(?i).*" + strings.TrimSpace(fmt.Sprintf("%v", value)) + ".*"
 | 
			
		||||
	}
 | 
			
		||||
	return value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Filters struct {
 | 
			
		||||
	And map[string]Filter `json:"and"`
 | 
			
		||||
	Or  map[string]Filter `json:"or"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Filter struct {
 | 
			
		||||
	Operator string      `json:"operator,omitempty"`
 | 
			
		||||
	Value    interface{} `json:"value,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Input = map[string]interface{}
 | 
			
		||||
 | 
			
		||||
func InputToBson(i Input, isUpdate bool) bson.D {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user