Ver Fonte

add FindAndCount method

xormplus há 7 anos atrás
pai
commit
69ca65ea86
3 ficheiros alterados com 36 adições e 1 exclusões
  1. 7 0
      engine.go
  2. 1 0
      interface.go
  3. 28 1
      session_find.go

+ 7 - 0
engine.go

@@ -1462,6 +1462,13 @@ func (engine *Engine) Find(beans interface{}, condiBeans ...interface{}) error {
 	return session.Find(beans, condiBeans...)
 }
 
+// FindAndCount find the results and also return the counts
+func (engine *Engine) FindAndCount(rowsSlicePtr interface{}, condiBean ...interface{}) (int64, error) {
+	session := engine.NewSession()
+	defer session.Close()
+	return session.FindAndCount(rowsSlicePtr, condiBean...)
+}
+
 // Iterate record by record handle records from table, bean's non-empty fields
 // are conditions.
 func (engine *Engine) Iterate(bean interface{}, fun IterFunc) error {

+ 1 - 0
interface.go

@@ -30,6 +30,7 @@ type Interface interface {
 	Exec(string, ...interface{}) (sql.Result, error)
 	Exist(bean ...interface{}) (bool, error)
 	Find(interface{}, ...interface{}) error
+	FindAndCount(interface{}, ...interface{}) (int64, error)
 	Get(interface{}) (bool, error)
 	GroupBy(keys string) *Session
 	ID(interface{}) *Session

+ 28 - 1
session_find.go

@@ -29,6 +29,29 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
 	return session.find(rowsSlicePtr, condiBean...)
 }
 
+// FindAndCount find the results and also return the counts
+func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...interface{}) (int64, error) {
+	if session.isAutoClose {
+		defer session.Close()
+	}
+
+	session.autoResetStatement = false
+	err := session.find(rowsSlicePtr, condiBean...)
+	if err != nil {
+		return 0, err
+	}
+
+	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr))
+	if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map {
+		return 0, errors.New("needs a pointer to a slice or a map")
+	}
+
+	sliceElementType := sliceValue.Type().Elem()
+	session.autoResetStatement = true
+
+	return session.Count(reflect.New(sliceElementType).Interface())
+}
+
 func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error {
 	sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr))
 	if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map {
@@ -165,7 +188,11 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{})
 			i := len(params)
 			if i == 1 {
 				vv := reflect.ValueOf(params[0])
-				if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map {
+				//if  vv.Kind() == reflect.Slice{
+				//	sqlStr = sql
+				//	args = params
+				//}
+				if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map{
 					sqlStr = sql
 					args = params
 				} else {