Merge pull request #805 from TeoV/DataUnitsChange

Update CDRsFilter , RPCCDRsFilter , AttrExpFileCdrs structure
This commit is contained in:
Dan Christian Bogos
2017-11-03 12:51:15 +01:00
committed by GitHub
8 changed files with 34 additions and 140 deletions

View File

@@ -1354,11 +1354,11 @@ func TestApierMaxDebitInexistentAcnt(t *testing.T) {
func TestApierCdrServer(t *testing.T) {
httpClient := new(http.Client)
cdrForm1 := url.Values{utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.DIRECTION: []string{"*out"},
cdrForm1 := url.Values{utils.ACCID: []string{"dsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED},
utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, utils.DESTINATION: []string{"1002"},
utils.SETUP_TIME: []string{"2013-11-07T08:42:22Z"},
utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}}
cdrForm2 := url.Values{utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED}, utils.DIRECTION: []string{"*out"},
cdrForm2 := url.Values{utils.ACCID: []string{"adsafdsaf"}, utils.CDRHOST: []string{"192.168.1.1"}, utils.REQTYPE: []string{utils.META_RATED},
utils.TENANT: []string{"cgrates.org"}, utils.CATEGORY: []string{"call"}, utils.ACCOUNT: []string{"1001"}, utils.SUBJECT: []string{"1001"}, utils.DESTINATION: []string{"1002"},
utils.SETUP_TIME: []string{"2013-11-07T08:42:23Z"},
utils.ANSWER_TIME: []string{"2013-11-07T08:42:26Z"}, utils.USAGE: []string{"10"}, "field_extr1": []string{"val_extr1"}, "fieldextr2": []string{"valextr2"}}

View File

@@ -34,7 +34,7 @@ type AttrGetDataCost struct {
}
func (apier *ApierV1) GetDataCost(attrs AttrGetDataCost, reply *engine.DataCost) error {
usageAsDuration := time.Duration(attrs.Usage) * time.Second // Convert to seconds to match the loaded rates
usageAsDuration := time.Duration(attrs.Usage) * time.Nanosecond // Convert to seconds to match the loaded rates
cd := &engine.CallDescriptor{
Direction: attrs.Direction,
Category: attrs.Category,

View File

@@ -1 +1,2 @@
#Id,ConnectFee,Rate,RateUnit,RateIncrement,GroupIntervalStart
RT_DATA1,0,0.0,1048576,10240,0
1 RT_DATA1 #Id 0 ConnectFee 0.0 Rate 1048576 RateUnit 10240 RateIncrement 0 GroupIntervalStart
1 #Id ConnectFee Rate RateUnit RateIncrement GroupIntervalStart
2 RT_DATA1 RT_DATA1 0 0 0.0 0.0 1048576 1048576 10240 10240 0 0

View File

@@ -803,7 +803,6 @@ func NewCDRFromSQL(cdrSql *CDRsql) (cdr *CDR, err error) {
cdr.SetupTime = cdrSql.SetupTime
cdr.AnswerTime = cdrSql.AnswerTime
cdr.Usage = time.Duration(cdrSql.Usage)
cdr.CostSource = cdrSql.CostSource
cdr.Cost = cdrSql.Cost
cdr.ExtraInfo = cdrSql.ExtraInfo
@@ -813,7 +812,7 @@ func NewCDRFromSQL(cdrSql *CDRsql) (cdr *CDR, err error) {
}
}
if cdrSql.CostDetails != "" {
if err = json.Unmarshal([]byte(cdrSql.CostDetails), cdr.CostDetails); err != nil {
if err = json.Unmarshal([]byte(cdrSql.CostDetails), &cdr.CostDetails); err != nil {
return nil, err
}
}

View File

@@ -574,13 +574,6 @@ func testGetCDRs(cfg *config.CGRConfig) error {
} else if len(CDRs) != 6 {
return fmt.Errorf("testGetCDRs #35, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on direction
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Directions: []string{utils.OUT}}, false); err != nil {
return fmt.Errorf("testGetCDRs #36 err: %v", err)
} else if len(CDRs) != 10 {
return fmt.Errorf("testGetCDRs #37, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on Tenant
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{Tenants: []string{"itsyscom.com"}}, false); err != nil {
return fmt.Errorf("testGetCDRs #38 err: %v", err)
@@ -661,7 +654,7 @@ func testGetCDRs(cfg *config.CGRConfig) error {
return fmt.Errorf("testGetCDRs #63, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on MinUsage
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinUsage: "125"}, false); err != nil {
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinUsage: "125s"}, false); err != nil {
return fmt.Errorf("testGetCDRs #64, err: %v", err)
} else if len(CDRs) != 2 {
return fmt.Errorf("testGetCDRs #65, unexpected number of CDRs returned: %d", len(CDRs))
@@ -718,24 +711,6 @@ func testGetCDRs(cfg *config.CGRConfig) error {
} else if len(CDRs) != 2 {
return fmt.Errorf("testGetCDRs #77, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on MinPDD
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPDD: "20ms"}, false); err != nil {
return fmt.Errorf("testGetCDRs #78, err: %v", err)
} else if len(CDRs) != 7 {
return fmt.Errorf("testGetCDRs #79, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on maxPdd
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MaxPDD: "1s"}, false); err != nil {
return fmt.Errorf("testGetCDRs #80, err: %v", err)
} else if len(CDRs) != 8 {
return fmt.Errorf("testGetCDRs #81, unexpected number of CDRs returned: %+v", CDRs)
}
// Filter on minPdd, maxPdd
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{MinPDD: "10ms", MaxPDD: "1s"}, false); err != nil {
return fmt.Errorf("testGetCDRs #82, err: %v", err)
} else if len(CDRs) != 6 {
return fmt.Errorf("testGetCDRs #83, unexpected number of CDRs returned: %+v", CDRs)
}
// Combined filter
if CDRs, _, err := cdrStorage.GetCDRs(&utils.CDRsFilter{RequestTypes: []string{utils.META_RATED}, AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd}, false); err != nil {
return fmt.Errorf("testGetCDRs #84, err: %v", err)

View File

@@ -982,21 +982,7 @@ func (ms *MongoStorage) cleanEmptyFilters(filters bson.M) {
// _, err := col(utils.CDRsTBL).UpdateAll(bson.M{CGRIDLow: bson.M{"$in": cgrIds}}, bson.M{"$set": bson.M{"deleted_at": time.Now()}})
func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR, int64, error) {
var minPDD, maxPDD, minUsage, maxUsage *time.Duration
if len(qryFltr.MinPDD) != 0 {
if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MinPDD); err != nil {
return nil, 0, err
} else {
minPDD = &parsed
}
}
if len(qryFltr.MaxPDD) != 0 {
if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MaxPDD); err != nil {
return nil, 0, err
} else {
maxPDD = &parsed
}
}
var minUsage, maxUsage *time.Duration
if len(qryFltr.MinUsage) != 0 {
if parsed, err := utils.ParseDurationWithNanosecs(qryFltr.MinUsage); err != nil {
return nil, 0, err
@@ -1012,26 +998,22 @@ func (ms *MongoStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR,
}
}
filters := bson.M{
CGRIDLow: bson.M{"$in": qryFltr.CGRIDs, "$nin": qryFltr.NotCGRIDs},
RunIDLow: bson.M{"$in": qryFltr.RunIDs, "$nin": qryFltr.NotRunIDs},
OrderIDLow: bson.M{"$gte": qryFltr.OrderIDStart, "$lt": qryFltr.OrderIDEnd},
ToRLow: bson.M{"$in": qryFltr.ToRs, "$nin": qryFltr.NotToRs},
CDRHostLow: bson.M{"$in": qryFltr.OriginHosts, "$nin": qryFltr.NotOriginHosts},
CDRSourceLow: bson.M{"$in": qryFltr.Sources, "$nin": qryFltr.NotSources},
RequestTypeLow: bson.M{"$in": qryFltr.RequestTypes, "$nin": qryFltr.NotRequestTypes},
DirectionLow: bson.M{"$in": qryFltr.Directions, "$nin": qryFltr.NotDirections},
TenantLow: bson.M{"$in": qryFltr.Tenants, "$nin": qryFltr.NotTenants},
CategoryLow: bson.M{"$in": qryFltr.Categories, "$nin": qryFltr.NotCategories},
AccountLow: bson.M{"$in": qryFltr.Accounts, "$nin": qryFltr.NotAccounts},
SubjectLow: bson.M{"$in": qryFltr.Subjects, "$nin": qryFltr.NotSubjects},
SupplierLow: bson.M{"$in": qryFltr.Suppliers, "$nin": qryFltr.NotSuppliers},
DisconnectCauseLow: bson.M{"$in": qryFltr.DisconnectCauses, "$nin": qryFltr.NotDisconnectCauses},
SetupTimeLow: bson.M{"$gte": qryFltr.SetupTimeStart, "$lt": qryFltr.SetupTimeEnd},
AnswerTimeLow: bson.M{"$gte": qryFltr.AnswerTimeStart, "$lt": qryFltr.AnswerTimeEnd},
CreatedAtLow: bson.M{"$gte": qryFltr.CreatedAtStart, "$lt": qryFltr.CreatedAtEnd},
UpdatedAtLow: bson.M{"$gte": qryFltr.UpdatedAtStart, "$lt": qryFltr.UpdatedAtEnd},
UsageLow: bson.M{"$gte": minUsage, "$lt": maxUsage},
PDDLow: bson.M{"$gte": minPDD, "$lt": maxPDD},
CGRIDLow: bson.M{"$in": qryFltr.CGRIDs, "$nin": qryFltr.NotCGRIDs},
RunIDLow: bson.M{"$in": qryFltr.RunIDs, "$nin": qryFltr.NotRunIDs},
OrderIDLow: bson.M{"$gte": qryFltr.OrderIDStart, "$lt": qryFltr.OrderIDEnd},
ToRLow: bson.M{"$in": qryFltr.ToRs, "$nin": qryFltr.NotToRs},
CDRHostLow: bson.M{"$in": qryFltr.OriginHosts, "$nin": qryFltr.NotOriginHosts},
CDRSourceLow: bson.M{"$in": qryFltr.Sources, "$nin": qryFltr.NotSources},
RequestTypeLow: bson.M{"$in": qryFltr.RequestTypes, "$nin": qryFltr.NotRequestTypes},
TenantLow: bson.M{"$in": qryFltr.Tenants, "$nin": qryFltr.NotTenants},
CategoryLow: bson.M{"$in": qryFltr.Categories, "$nin": qryFltr.NotCategories},
AccountLow: bson.M{"$in": qryFltr.Accounts, "$nin": qryFltr.NotAccounts},
SubjectLow: bson.M{"$in": qryFltr.Subjects, "$nin": qryFltr.NotSubjects},
SetupTimeLow: bson.M{"$gte": qryFltr.SetupTimeStart, "$lt": qryFltr.SetupTimeEnd},
AnswerTimeLow: bson.M{"$gte": qryFltr.AnswerTimeStart, "$lt": qryFltr.AnswerTimeEnd},
CreatedAtLow: bson.M{"$gte": qryFltr.CreatedAtStart, "$lt": qryFltr.CreatedAtEnd},
UpdatedAtLow: bson.M{"$gte": qryFltr.UpdatedAtStart, "$lt": qryFltr.UpdatedAtEnd},
UsageLow: bson.M{"$gte": minUsage, "$lt": maxUsage},
//CostDetailsLow + "." + AccountLow: bson.M{"$in": qryFltr.RatedAccounts, "$nin": qryFltr.NotRatedAccounts},
//CostDetailsLow + "." + SubjectLow: bson.M{"$in": qryFltr.RatedSubjects, "$nin": qryFltr.NotRatedSubjects},
}

View File

@@ -817,12 +817,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR,
if len(qryFltr.NotRequestTypes) != 0 {
q = q.Where("request_type not in (?)", qryFltr.NotRequestTypes)
}
if len(qryFltr.Directions) != 0 {
q = q.Where("direction in (?)", qryFltr.Directions)
}
if len(qryFltr.NotDirections) != 0 {
q = q.Where("direction not in (?)", qryFltr.NotDirections)
}
if len(qryFltr.Tenants) != 0 {
q = q.Where("tenant in (?)", qryFltr.Tenants)
}
@@ -869,18 +863,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR,
qIds.WriteString(" )")
q = q.Where(qIds.String())
}
if len(qryFltr.Suppliers) != 0 {
q = q.Where("supplier in (?)", qryFltr.Subjects)
}
if len(qryFltr.NotSuppliers) != 0 {
q = q.Where("supplier not in (?)", qryFltr.NotSubjects)
}
if len(qryFltr.DisconnectCauses) != 0 {
q = q.Where("disconnect_cause in (?)", qryFltr.DisconnectCauses)
}
if len(qryFltr.NotDisconnectCauses) != 0 {
q = q.Where("disconnect_cause not in (?)", qryFltr.NotDisconnectCauses)
}
if len(qryFltr.Costs) != 0 {
q = q.Where(utils.CDRsTBL+".cost in (?)", qryFltr.Costs)
}
@@ -974,22 +956,6 @@ func (self *SQLStorage) GetCDRs(qryFltr *utils.CDRsFilter, remove bool) ([]*CDR,
}
}
if len(qryFltr.MinPDD) != 0 {
if minPDD, err := utils.ParseDurationWithNanosecs(qryFltr.MinPDD); err != nil {
return nil, 0, err
} else {
q = q.Where("pdd >= ?", minPDD.Nanoseconds())
}
}
if len(qryFltr.MaxPDD) != 0 {
if maxPDD, err := utils.ParseDurationWithNanosecs(qryFltr.MaxPDD); err != nil {
return nil, 0, err
} else {
q = q.Where("pdd < ?", maxPDD.Nanoseconds())
}
}
if qryFltr.MinCost != nil {
if qryFltr.MaxCost == nil {
q = q.Where("cost >= ?", *qryFltr.MinCost)

View File

@@ -736,7 +736,6 @@ type AttrExpFileCdrs struct {
CdrHosts []string // If provided, it will filter cdrhost
CdrSources []string // If provided, it will filter cdrsource
ReqTypes []string // If provided, it will fiter reqtype
Directions []string // If provided, it will fiter direction
Tenants []string // If provided, it will filter tenant
Categories []string // If provided, it will filter çategory
Accounts []string // If provided, it will filter account
@@ -761,7 +760,6 @@ func (self *AttrExpFileCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error)
OriginHosts: self.CdrHosts,
Sources: self.CdrSources,
RequestTypes: self.ReqTypes,
Directions: self.Directions,
Tenants: self.Tenants,
Categories: self.Categories,
Accounts: self.Accounts,
@@ -835,7 +833,6 @@ func (self *AttrGetCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, error) {
OriginHosts: self.CdrHosts,
Sources: self.CdrSources,
RequestTypes: self.ReqTypes,
Directions: self.Directions,
Tenants: self.Tenants,
Categories: self.Categories,
Accounts: self.Accounts,
@@ -879,7 +876,6 @@ type AttrRateCdrs struct {
CdrHosts []string // If provided, it will filter cdrhost
CdrSources []string // If provided, it will filter cdrsource
ReqTypes []string // If provided, it will fiter reqtype
Directions []string // If provided, it will fiter direction
Tenants []string // If provided, it will filter tenant
Categories []string // If provided, it will filter çategory
Accounts []string // If provided, it will filter account
@@ -902,7 +898,6 @@ func (attrRateCDRs *AttrRateCdrs) AsCDRsFilter(timezone string) (*CDRsFilter, er
Sources: attrRateCDRs.CdrSources,
ToRs: attrRateCDRs.TORs,
RequestTypes: attrRateCDRs.ReqTypes,
Directions: attrRateCDRs.Directions,
Tenants: attrRateCDRs.Tenants,
Categories: attrRateCDRs.Categories,
Accounts: attrRateCDRs.Accounts,
@@ -1013,8 +1008,6 @@ type CDRsFilter struct {
NotToRs []string // Filter specific TORs out
RequestTypes []string // If provided, it will fiter reqtype
NotRequestTypes []string // Filter out specific request types
Directions []string // If provided, it will fiter direction
NotDirections []string // Filter out specific directions
Tenants []string // If provided, it will filter tenant
NotTenants []string // If provided, it will filter tenant
Categories []string // If provided, it will filter çategory
@@ -1025,10 +1018,6 @@ type CDRsFilter struct {
NotSubjects []string // Filter out specific subjects
DestinationPrefixes []string // If provided, it will filter on destination prefix
NotDestinationPrefixes []string // Filter out specific destination prefixes
Suppliers []string // If provided, it will filter the supplier
NotSuppliers []string // Filter out specific suppliers
DisconnectCauses []string // Filter for disconnect Cause
NotDisconnectCauses []string // Filter out specific disconnect causes
Costs []float64 // Query based on costs specified
NotCosts []float64 // Filter out specific costs out from result
ExtraFields map[string]string // Query based on extra fields content
@@ -1045,8 +1034,6 @@ type CDRsFilter struct {
UpdatedAtEnd *time.Time // End interval, smaller than
MinUsage string // Start of the usage interval (>=)
MaxUsage string // End of the usage interval (<)
MinPDD string // Start of the pdd interval (>=)
MaxPDD string // End of the pdd interval (<)
MinCost *float64 // Start of the cost interval (>=)
MaxCost *float64 // End of the usage interval (<)
Unscoped bool // Include soft-deleted records in results
@@ -1069,8 +1056,6 @@ type RPCCDRsFilter struct {
NotToRs []string // Filter specific TORs out
RequestTypes []string // If provided, it will fiter reqtype
NotRequestTypes []string // Filter out specific request types
Directions []string // If provided, it will fiter direction
NotDirections []string // Filter out specific directions
Tenants []string // If provided, it will filter tenant
NotTenants []string // If provided, it will filter tenant
Categories []string // If provided, it will filter çategory
@@ -1081,10 +1066,6 @@ type RPCCDRsFilter struct {
NotSubjects []string // Filter out specific subjects
DestinationPrefixes []string // If provided, it will filter on destination prefix
NotDestinationPrefixes []string // Filter out specific destination prefixes
Suppliers []string // If provided, it will filter the supplier
NotSuppliers []string // Filter out specific suppliers
DisconnectCauses []string // Filter for disconnect Cause
NotDisconnectCauses []string // Filter out specific disconnect causes
Costs []float64 // Query based on costs specified
NotCosts []float64 // Filter out specific costs out from result
ExtraFields map[string]string // Query based on extra fields content
@@ -1101,8 +1082,6 @@ type RPCCDRsFilter struct {
UpdatedAtEnd string // End interval, smaller than
MinUsage string // Start of the usage interval (>=)
MaxUsage string // End of the usage interval (<)
MinPDD string // Start of the pdd interval (>=)
MaxPDD string // End of the pdd interval (<)
MinCost *float64 // Start of the cost interval (>=)
MaxCost *float64 // End of the usage interval (<)
Paginator // Add pagination
@@ -1122,8 +1101,6 @@ func (self *RPCCDRsFilter) AsCDRsFilter(timezone string) (*CDRsFilter, error) {
NotSources: self.NotSources,
RequestTypes: self.RequestTypes,
NotRequestTypes: self.NotRequestTypes,
Directions: self.Directions,
NotDirections: self.NotDirections,
Tenants: self.Tenants,
NotTenants: self.NotTenants,
Categories: self.Categories,
@@ -1134,23 +1111,17 @@ func (self *RPCCDRsFilter) AsCDRsFilter(timezone string) (*CDRsFilter, error) {
NotSubjects: self.NotSubjects,
DestinationPrefixes: self.DestinationPrefixes,
NotDestinationPrefixes: self.NotDestinationPrefixes,
Suppliers: self.Suppliers,
NotSuppliers: self.NotSuppliers,
DisconnectCauses: self.DisconnectCauses,
NotDisconnectCauses: self.NotDisconnectCauses,
Costs: self.Costs,
NotCosts: self.NotCosts,
ExtraFields: self.ExtraFields,
NotExtraFields: self.NotExtraFields,
OrderIDStart: self.OrderIDStart,
OrderIDEnd: self.OrderIDEnd,
MinUsage: self.MinUsage,
MaxUsage: self.MaxUsage,
MinPDD: self.MinPDD,
MaxPDD: self.MaxPDD,
MinCost: self.MinCost,
MaxCost: self.MaxCost,
Paginator: self.Paginator,
Costs: self.Costs,
NotCosts: self.NotCosts,
ExtraFields: self.ExtraFields,
NotExtraFields: self.NotExtraFields,
OrderIDStart: self.OrderIDStart,
OrderIDEnd: self.OrderIDEnd,
MinUsage: self.MinUsage,
MaxUsage: self.MaxUsage,
MinCost: self.MinCost,
MaxCost: self.MaxCost,
Paginator: self.Paginator,
}
if len(self.SetupTimeStart) != 0 {
if sTimeStart, err := ParseTimeDetectLayout(self.SetupTimeStart, timezone); err != nil {