diff --git a/orm/struct_filter.go b/orm/struct_filter.go deleted file mode 100644 index 8ab4f55b..00000000 --- a/orm/struct_filter.go +++ /dev/null @@ -1,124 +0,0 @@ -package orm - -import ( - "reflect" - "sync" - - "github.com/go-pg/pg/v10/types" - "github.com/go-pg/urlstruct" -) - -var ops = [...]string{ - urlstruct.OpEq: " = ", - urlstruct.OpNotEq: " != ", - urlstruct.OpLT: " < ", - urlstruct.OpLTE: " <= ", - urlstruct.OpGT: " > ", - urlstruct.OpGTE: " >= ", - urlstruct.OpIEq: " ILIKE ", - urlstruct.OpMatch: " SIMILAR TO ", -} - -var sliceOps = [...]string{ - urlstruct.OpEq: " = ANY", - urlstruct.OpNotEq: " != ALL", -} - -func getOp(ops []string, op urlstruct.OpCode) string { - if int(op) < len(ops) { - return ops[op] - } - return "" -} - -type structFilter struct { - value reflect.Value // reflect.Struct - - infoOnce sync.Once - info *urlstruct.StructInfo // lazy -} - -var _ queryWithSepAppender = (*structFilter)(nil) - -func newStructFilter(v interface{}) *structFilter { - if v, ok := v.(*structFilter); ok { - return v - } - return &structFilter{ - value: reflect.Indirect(reflect.ValueOf(v)), - } -} - -func (sf *structFilter) AppendSep(b []byte) []byte { - return append(b, " AND "...) -} - -func (sf *structFilter) AppendQuery(fmter QueryFormatter, b []byte) ([]byte, error) { - sf.infoOnce.Do(func() { - sf.info = urlstruct.DescribeStruct(sf.value.Type()) - }) - - isPlaceholder := isPlaceholderFormatter(fmter) - startLen := len(b) - - prevLen := len(b) - for _, f := range sf.info.Fields { - fv := f.Value(sf.value) - if f.Omit(fv) { - continue - } - - isSlice := f.Type.Kind() == reflect.Slice - - var op string - if isSlice { - op = getOp(sliceOps[:], f.Op) - } else { - op = getOp(ops[:], f.Op) - } - if op == "" { - continue - } - - var appendValue types.AppenderFunc - if isSlice { - appendValue = types.ArrayAppender(f.Type) - } else { - appendValue = types.Appender(f.Type) - } - if appendValue == nil { - continue - } - - if len(b) != prevLen { - b = append(b, " AND "...) - prevLen = len(b) - } - - if sf.info.TableName != "" { - b = types.AppendIdent(b, sf.info.TableName, 1) - b = append(b, '.') - } - b = append(b, '"') - b = append(b, f.Column...) - b = append(b, '"') - b = append(b, op...) - if isSlice { - b = append(b, '(') - } - if isPlaceholder { - b = append(b, '?') - } else { - b = appendValue(b, fv, 1) - } - if isSlice { - b = append(b, ')') - } - } - - if len(b) == startLen { - b = append(b, "TRUE"...) - } - - return b, nil -} diff --git a/orm/struct_filter_test.go b/orm/struct_filter_test.go deleted file mode 100644 index 3454a514..00000000 --- a/orm/struct_filter_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package orm - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -type embeddedFilter struct { - Field string - FieldNEQ string - FieldLT int8 - FieldLTE int16 - FieldGT int32 - FieldGTE int64 - FieldIEQ string - FieldMatch string -} - -type Filter struct { - embeddedFilter - - Multi []string - MultiNEQ []int - - Time time.Time - - Omit []byte `pg:"-"` -} - -var _ = Describe("structFilter", func() { - It("omits empty fields", func() { - f := newStructFilter(&Filter{}) - - b, err := f.AppendQuery(defaultFmter, nil) - Expect(err).NotTo(HaveOccurred()) - Expect(string(b)).To(Equal("TRUE")) - }) - - It("constructs WHERE clause with filled filter", func() { - f := newStructFilter(&Filter{ - embeddedFilter: embeddedFilter{ - Field: "one", - FieldNEQ: "two", - FieldLT: 1, - FieldLTE: 2, - FieldGT: 3, - FieldGTE: 4, - FieldIEQ: "three", - FieldMatch: "four", - }, - - Multi: []string{"one", "two"}, - MultiNEQ: []int{3, 4}, - - Time: time.Unix(0, 0), - }) - - b, err := f.AppendQuery(defaultFmter, nil) - Expect(err).NotTo(HaveOccurred()) - Expect(string(b)).To(Equal(`"field" = 'one' AND "field" != 'two' AND "field" < 1 AND "field" <= 2 AND "field" > 3 AND "field" >= 4 AND "field" ILIKE 'three' AND "field" SIMILAR TO 'four' AND "multi" = ANY('{"one","two"}') AND "multi" != ALL('{3,4}') AND "time" = '1970-01-01 00:00:00+00:00:00'`)) - }) -})