diff --git a/engine/storage_cdrs_it_test.go b/engine/storage_cdrs_it_test.go index e5a336af8..4c74b9704 100644 --- a/engine/storage_cdrs_it_test.go +++ b/engine/storage_cdrs_it_test.go @@ -753,13 +753,57 @@ func testGetCDRs(cfg *config.CGRConfig) error { } else if len(CDRs) != 7 { return fmt.Errorf("testGetCDRs #94, unexpected number of CDRs returned: %+v", len(CDRs)) } - // Filter OrderBy - // if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinUsage: "12s", OrderBy: "orderid"}, false); err != nil { - // return fmt.Errorf("testGetCDRs #95, err: %v", err) - // } else { - // for _, cdr := range CDRs { - // } - // } - + //Filter by OrderID descendent + if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderBy: "OrderID;desc"}, false); err != nil { + return fmt.Errorf("testGetCDRs #95, err: %v", err) + } else { + for i, _ := range CDRs { + if i+1 > len(CDRs)-1 { + break + } + if CDRs[i].OrderID < CDRs[i+1].OrderID { + return fmt.Errorf("%+v should be greater than %+v \n", CDRs[i].OrderID, CDRs[i+1].OrderID) + } + } + } + //Filter by OrderID ascendent + if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderBy: "OrderID"}, false); err != nil { + return fmt.Errorf("testGetCDRs #95, err: %v", err) + } else { + for i, _ := range CDRs { + if i+1 > len(CDRs)-1 { + break + } + if CDRs[i].OrderID > CDRs[i+1].OrderID { + return fmt.Errorf("%+v sould be smaller than %+v \n", CDRs[i].OrderID, CDRs[i+1].OrderID) + } + } + } + //Filter by Cost descendent + if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderBy: "Cost;desc"}, false); err != nil { + return fmt.Errorf("testGetCDRs #95, err: %v", err) + } else { + for i, _ := range CDRs { + if i+1 > len(CDRs)-1 { + break + } + if CDRs[i].Cost < CDRs[i+1].Cost { + return fmt.Errorf("%+v should be greater than %+v \n", CDRs[i].Cost, CDRs[i+1].Cost) + } + } + } + //Filter by Cost ascendent + if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{OrderBy: "Cost"}, false); err != nil { + return fmt.Errorf("testGetCDRs #95, err: %v", err) + } else { + for i, _ := range CDRs { + if i+1 > len(CDRs)-1 { + break + } + if CDRs[i].Cost > CDRs[i+1].Cost { + return fmt.Errorf("%+v sould be smaller than %+v \n", CDRs[i].Cost, CDRs[i+1].Cost) + } + } + } return nil } diff --git a/engine/storage_mongo_stordb.go b/engine/storage_mongo_stordb.go index f21e2ef6e..73f959aca 100644 --- a/engine/storage_mongo_stordb.go +++ b/engine/storage_mongo_stordb.go @@ -1119,10 +1119,27 @@ func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, if qryFltr.Paginator.Offset != nil { q = q.Skip(*qryFltr.Paginator.Offset) } - // need to check if it's descencent - // after that make a switch to make the parameter compatible if qryFltr.OrderBy != "" { - q = q.Sort(qryFltr.OrderBy) + var orderVal string + separateVals := strings.Split(qryFltr.OrderBy, utils.INFIELD_SEP) + if len(separateVals) == 2 && separateVals[1] == "desc" { + orderVal += "-" + } + switch separateVals[0] { + case utils.OrderID: + orderVal += "orderid" + case utils.AnswerTime: + orderVal += "answertime" + case utils.SetupTime: + orderVal += "setuptime" + case utils.Usage: + orderVal += "usage" + case utils.Cost: + orderVal += "cost" + default: + return nil, 0, fmt.Errorf("Invalid value : %s", separateVals[0]) + } + q = q.Sort(orderVal) } if qryFltr.Count { cnt, err := q.Count() diff --git a/engine/storage_sql.go b/engine/storage_sql.go index 48d139e8c..dffe30fe8 100644 --- a/engine/storage_sql.go +++ b/engine/storage_sql.go @@ -1042,10 +1042,31 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, if qryFltr.UpdatedAtEnd != nil && !qryFltr.UpdatedAtEnd.IsZero() { q = q.Where("updated_at < ?", qryFltr.UpdatedAtEnd) } - // need to check if it's descencent - // after that make a switch to make the parameter compatible if qryFltr.OrderBy != "" { - q = q.Order(qryFltr.OrderBy) + var orderVal string + separateVals := strings.Split(qryFltr.OrderBy, utils.INFIELD_SEP) + switch separateVals[0] { + case utils.OrderID: + orderVal = "id" + case utils.AnswerTime: + orderVal = "answer_time" + case utils.SetupTime: + orderVal = "setup_time" + case utils.Usage: + if self.db.Dialect().GetName() == utils.MYSQL { + orderVal = "`usage`" + } else { + orderVal = "usage" + } + case utils.Cost: + orderVal = "cost" + default: + return nil, 0, fmt.Errorf("Invalid value : %s", separateVals[0]) + } + if len(separateVals) == 2 && separateVals[1] == "desc" { + orderVal += " DESC" + } + q = q.Order(orderVal) } if len(qryFltr.MinUsage) != 0 { minUsage, err := utils.ParseDurationWithNanosecs(qryFltr.MinUsage)