Преглед на файлове

fix findandcount bug with order

xormplus преди 7 години
родител
ревизия
cbf23081bf
променени са 1 файла, в които са добавени 40 реда и са изтрити 21 реда
  1. 40 21
      session_find.go

+ 40 - 21
session_find.go

@@ -35,32 +35,51 @@ func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...inte
 		defer session.Close()
 	}
 
-	session.autoResetStatement = false
-	err := session.find(rowsSlicePtr, condiBean...)
-	if err != nil {
-		return 0, err
-	}
+	if session.isSqlFunc {
+		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")
-	}
+		var sql = session.statement.RawSQL
+		session.autoResetStatement = true
+		sql = "select count(1) from (" + sql + ") t"
+		var count int64
+		_, err = session.SQL(sql).Get(&count)
+		if err != nil {
+			return 0, err
+		}
+		return count, nil
 
-	sliceElementType := sliceValue.Type().Elem()
-	if sliceElementType.Kind() == reflect.Ptr {
-		sliceElementType = sliceElementType.Elem()
-	}
-	session.autoResetStatement = true
+	} else {
+		session.autoResetStatement = false
+		err := session.find(rowsSlicePtr, condiBean...)
+		if err != nil {
+			return 0, err
+		}
 
-	if session.statement.selectStr != "" {
-		session.statement.selectStr = ""
-	}
+		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")
+		}
 
-	if session.statement.OrderStr != "" {
-		session.statement.OrderStr = ""
-	}
+		sliceElementType := sliceValue.Type().Elem()
+		if sliceElementType.Kind() == reflect.Ptr {
+			sliceElementType = sliceElementType.Elem()
+		}
+		session.autoResetStatement = true
+
+		if session.statement.selectStr != "" {
+			session.statement.selectStr = ""
+		}
 
-	return session.Count(reflect.New(sliceElementType).Interface())
+		if session.statement.OrderStr != "" {
+			session.statement.OrderStr = ""
+		}
+
+		return session.Count(reflect.New(sliceElementType).Interface())
+	}
 
 }