mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Adding PDD to storDb, renaming CdrsFilter.FilterOnDerived -> CdrsFilter.FilterOnRated, added storDb store-restore CDR tests
This commit is contained in:
@@ -21,6 +21,7 @@ CREATE TABLE cdrs_primary (
|
||||
setup_time datetime NOT NULL,
|
||||
answer_time datetime NOT NULL,
|
||||
`usage` DECIMAL(30,9) NOT NULL,
|
||||
pdd DECIMAL(12,9) NOT NULL,
|
||||
supplier varchar(128) NOT NULL,
|
||||
disconnect_cause varchar(64) NOT NULL,
|
||||
created_at TIMESTAMP,
|
||||
@@ -93,6 +94,7 @@ CREATE TABLE `rated_cdrs` (
|
||||
setup_time datetime NOT NULL,
|
||||
answer_time datetime NOT NULL,
|
||||
`usage` DECIMAL(30,9) NOT NULL,
|
||||
pdd DECIMAL(12,9) NOT NULL,
|
||||
supplier varchar(128) NOT NULL,
|
||||
disconnect_cause varchar(64) NOT NULL,
|
||||
cost DECIMAL(20,4) DEFAULT NULL,
|
||||
|
||||
@@ -21,6 +21,7 @@ CREATE TABLE cdrs_primary (
|
||||
setup_time TIMESTAMP NOT NULL,
|
||||
answer_time TIMESTAMP NOT NULL,
|
||||
usage NUMERIC(30,9) NOT NULL,
|
||||
pdd NUMERIC(12,9) NOT NULL,
|
||||
supplier VARCHAR(128) NOT NULL,
|
||||
disconnect_cause VARCHAR(64) NOT NULL,
|
||||
created_at TIMESTAMP,
|
||||
@@ -89,6 +90,7 @@ CREATE TABLE rated_cdrs (
|
||||
setup_time TIMESTAMP NOT NULL,
|
||||
answer_time TIMESTAMP NOT NULL,
|
||||
usage NUMERIC(30,9) NOT NULL,
|
||||
pdd NUMERIC(12,9) NOT NULL,
|
||||
supplier VARCHAR(128) NOT NULL,
|
||||
disconnect_cause VARCHAR(64) NOT NULL,
|
||||
cost NUMERIC(20,4) DEFAULT NULL,
|
||||
|
||||
@@ -303,6 +303,7 @@ type TblCdrsPrimary struct {
|
||||
SetupTime time.Time
|
||||
AnswerTime time.Time
|
||||
Usage float64
|
||||
Pdd float64
|
||||
Supplier string
|
||||
DisconnectCause string
|
||||
CreatedAt time.Time
|
||||
@@ -362,6 +363,7 @@ type TblRatedCdr struct {
|
||||
SetupTime time.Time
|
||||
AnswerTime time.Time
|
||||
Usage float64
|
||||
Pdd float64
|
||||
Supplier string
|
||||
DisconnectCause string
|
||||
Cost float64
|
||||
|
||||
@@ -106,7 +106,7 @@ func (self *MySQLStorage) LogCallCost(cgrid, source, runid string, cc *CallCost)
|
||||
}
|
||||
|
||||
func (self *MySQLStorage) SetRatedCdr(storedCdr *StoredCdr) (err error) {
|
||||
_, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,reqtype,direction,tenant,category,account,subject,destination,setup_time,answer_time,`usage`,supplier,disconnect_cause,cost,extra_info,created_at) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%v,'%s','%s',%f,'%s','%s') ON DUPLICATE KEY UPDATE reqtype=values(reqtype),direction=values(direction),tenant=values(tenant),category=values(category),account=values(account),subject=values(subject),destination=values(destination),setup_time=values(setup_time),answer_time=values(answer_time),`usage`=values(`usage`),cost=values(cost),supplier=values(supplier),disconnect_cause=values(disconnect_cause),extra_info=values(extra_info), updated_at='%s'",
|
||||
_, err = self.Db.Exec(fmt.Sprintf("INSERT INTO %s (cgrid,runid,reqtype,direction,tenant,category,account,subject,destination,setup_time,answer_time,`usage`,pdd,supplier,disconnect_cause,cost,extra_info,created_at) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%v,%v,'%s','%s',%f,'%s','%s') ON DUPLICATE KEY UPDATE reqtype=values(reqtype),direction=values(direction),tenant=values(tenant),category=values(category),account=values(account),subject=values(subject),destination=values(destination),setup_time=values(setup_time),answer_time=values(answer_time),`usage`=values(`usage`),pdd=values(pdd),cost=values(cost),supplier=values(supplier),disconnect_cause=values(disconnect_cause),extra_info=values(extra_info), updated_at='%s'",
|
||||
utils.TBL_RATED_CDRS,
|
||||
storedCdr.CgrId,
|
||||
storedCdr.MediationRunId,
|
||||
@@ -120,6 +120,7 @@ func (self *MySQLStorage) SetRatedCdr(storedCdr *StoredCdr) (err error) {
|
||||
storedCdr.SetupTime,
|
||||
storedCdr.AnswerTime,
|
||||
storedCdr.Usage.Seconds(),
|
||||
storedCdr.Pdd.Seconds(),
|
||||
storedCdr.Supplier,
|
||||
storedCdr.DisconnectCause,
|
||||
storedCdr.Cost,
|
||||
|
||||
@@ -433,23 +433,23 @@ func TestMySQLSetCdr(t *testing.T) {
|
||||
}
|
||||
cgrCdr1 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa1", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org",
|
||||
utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:20Z",
|
||||
utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: TEST_SQL}
|
||||
utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "10s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", utils.CDRSOURCE: TEST_SQL}
|
||||
|
||||
cgrCdr2 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa2", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_PREPAID, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org",
|
||||
utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "1002", utils.SETUP_TIME: "2013-11-08T08:42:22Z",
|
||||
utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
utils.ANSWER_TIME: "2013-11-08T08:42:26Z", utils.USAGE: "20", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
|
||||
cgrCdr3 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa3", utils.CDRHOST: "192.168.1.1", utils.REQTYPE: utils.META_RATED, utils.DIRECTION: "*out", utils.TENANT: "cgrates.org",
|
||||
utils.CATEGORY: "premium_call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "1001", utils.SETUP_TIME: "2013-11-07T08:42:24Z",
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "60s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
|
||||
cgrCdr4 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa4", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_PSEUDOPREPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com",
|
||||
utils.CATEGORY: "call", utils.ACCOUNT: "1001", utils.SUBJECT: "1001", utils.DESTINATION: "+4986517174964", utils.SETUP_TIME: "2013-11-07T08:42:21Z",
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "1m2s", utils.PDD: "4s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
|
||||
cgrCdr5 := &CgrCdr{utils.TOR: utils.VOICE, utils.ACCID: "aaa5", utils.CDRHOST: "192.168.1.2", utils.REQTYPE: utils.META_POSTPAID, utils.DIRECTION: "*out", utils.TENANT: "itsyscom.com",
|
||||
utils.CATEGORY: "call", utils.ACCOUNT: "1002", utils.SUBJECT: "1002", utils.DESTINATION: "+4986517174963", utils.SETUP_TIME: "2013-11-07T08:42:25Z",
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
utils.ANSWER_TIME: "2013-11-07T08:42:26Z", utils.USAGE: "15s", utils.PDD: "7s", utils.SUPPLIER: "SUPPL1", "field_extr1": "val_extr1", "fieldextr2": "valextr2", "cdrsource": TEST_SQL}
|
||||
|
||||
for _, cdr := range []*CgrCdr{cgrCdr1, cgrCdr2, cgrCdr3, cgrCdr4, cgrCdr5} {
|
||||
if err := mysqlDb.SetCdr(cdr.AsStoredCdr()); err != nil {
|
||||
@@ -459,21 +459,21 @@ func TestMySQLSetCdr(t *testing.T) {
|
||||
strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201}
|
||||
strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String())
|
||||
strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN2", ReqType: utils.META_PREPAID,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(12) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(12) * time.Second, Pdd: time.Duration(4) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201}
|
||||
strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String())
|
||||
strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: TEST_SQL, ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1000", Destination: "+4986517174963",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201}
|
||||
strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String())
|
||||
@@ -492,21 +492,21 @@ func TestMySQLSetRatedCdr(t *testing.T) {
|
||||
strCdr1 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb1", CdrHost: "192.168.1.1", CdrSource: "UNKNOWN", ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201}
|
||||
strCdr1.CgrId = utils.Sha1(strCdr1.AccId, strCdr1.SetupTime.String())
|
||||
strCdr2 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb2", CdrHost: "192.168.1.2", CdrSource: "UNKNOWN", ReqType: utils.META_PREPAID,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(12) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(12) * time.Second, Pdd: time.Duration(7) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 0.201}
|
||||
strCdr2.CgrId = utils.Sha1(strCdr2.AccId, strCdr2.SetupTime.String())
|
||||
strCdr3 := &StoredCdr{TOR: utils.VOICE, AccId: "bbb3", CdrHost: "192.168.1.1", CdrSource: TEST_SQL, ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "itsyscom.com", Category: "call", Account: "1002", Subject: "1002", Destination: "+4986517174964",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Supplier: "SUPPL1",
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: "wholesale_run", Cost: 1.201}
|
||||
strCdr3.CgrId = utils.Sha1(strCdr3.AccId, strCdr3.SetupTime.String())
|
||||
@@ -808,7 +808,7 @@ func TestMySQLGetStoredCdrs(t *testing.T) {
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
}
|
||||
// Filter on ignoreDerived
|
||||
if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnDerived: true}); err != nil {
|
||||
if storedCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(storedCdrs) != 0 { // ToDo: Recheck this value
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
@@ -850,3 +850,80 @@ func TestMySQLRemStoredCdrs(t *testing.T) {
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure that what we get is what we set
|
||||
func TestMySQLStoreRestoreCdr(t *testing.T) {
|
||||
if !*testLocal {
|
||||
return
|
||||
}
|
||||
strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201}
|
||||
strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String())
|
||||
if err := mysqlDb.SetCdr(strCdr); err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
if err := mysqlDb.SetRatedCdr(strCdr); err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
// Check RawCdr
|
||||
if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(rcvCdrs) != 1 {
|
||||
t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs)
|
||||
} else {
|
||||
rcvCdr := rcvCdrs[0]
|
||||
if strCdr.CgrId != rcvCdr.CgrId ||
|
||||
strCdr.TOR != rcvCdr.TOR ||
|
||||
strCdr.AccId != rcvCdr.AccId ||
|
||||
strCdr.CdrHost != rcvCdr.CdrHost ||
|
||||
strCdr.ReqType != rcvCdr.ReqType ||
|
||||
strCdr.Direction != rcvCdr.Direction ||
|
||||
strCdr.Tenant != rcvCdr.Tenant ||
|
||||
strCdr.Category != rcvCdr.Category ||
|
||||
strCdr.Account != rcvCdr.Account ||
|
||||
strCdr.Subject != rcvCdr.Subject ||
|
||||
strCdr.Destination != rcvCdr.Destination ||
|
||||
!strCdr.SetupTime.Equal(rcvCdr.SetupTime) ||
|
||||
!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) ||
|
||||
strCdr.Usage != rcvCdr.Usage ||
|
||||
strCdr.Pdd != rcvCdr.Pdd ||
|
||||
strCdr.Supplier != rcvCdr.Supplier ||
|
||||
strCdr.DisconnectCause != rcvCdr.DisconnectCause ||
|
||||
!reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0])
|
||||
}
|
||||
}
|
||||
// Check RatedCdr
|
||||
if rcvCdrs, _, err := mysqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(rcvCdrs) != 1 {
|
||||
t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs)
|
||||
} else {
|
||||
rcvCdr := rcvCdrs[0]
|
||||
if strCdr.CgrId != rcvCdr.CgrId ||
|
||||
strCdr.TOR != rcvCdr.TOR ||
|
||||
strCdr.AccId != rcvCdr.AccId ||
|
||||
strCdr.CdrHost != rcvCdr.CdrHost ||
|
||||
strCdr.ReqType != rcvCdr.ReqType ||
|
||||
strCdr.Direction != rcvCdr.Direction ||
|
||||
strCdr.Tenant != rcvCdr.Tenant ||
|
||||
strCdr.Category != rcvCdr.Category ||
|
||||
strCdr.Account != rcvCdr.Account ||
|
||||
strCdr.Subject != rcvCdr.Subject ||
|
||||
strCdr.Destination != rcvCdr.Destination ||
|
||||
//!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe
|
||||
//!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe
|
||||
strCdr.Usage != rcvCdr.Usage ||
|
||||
strCdr.Pdd != rcvCdr.Pdd ||
|
||||
strCdr.Supplier != rcvCdr.Supplier ||
|
||||
strCdr.DisconnectCause != rcvCdr.DisconnectCause ||
|
||||
strCdr.Cost != rcvCdr.Cost ||
|
||||
!reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,6 +138,7 @@ func (self *PostgresStorage) SetRatedCdr(cdr *StoredCdr) (err error) {
|
||||
SetupTime: cdr.SetupTime,
|
||||
AnswerTime: cdr.AnswerTime,
|
||||
Usage: cdr.Usage.Seconds(),
|
||||
Pdd: cdr.Pdd.Seconds(),
|
||||
Supplier: cdr.Supplier,
|
||||
DisconnectCause: cdr.DisconnectCause,
|
||||
Cost: cdr.Cost,
|
||||
@@ -149,7 +150,8 @@ func (self *PostgresStorage) SetRatedCdr(cdr *StoredCdr) (err error) {
|
||||
tx = self.db.Begin()
|
||||
updated := tx.Model(TblRatedCdr{}).Where(&TblRatedCdr{Cgrid: cdr.CgrId, Runid: cdr.MediationRunId}).Updates(&TblRatedCdr{Reqtype: cdr.ReqType,
|
||||
Direction: cdr.Direction, Tenant: cdr.Tenant, Category: cdr.Category, Account: cdr.Account, Subject: cdr.Subject, Destination: cdr.Destination,
|
||||
SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause, Cost: cdr.Cost, ExtraInfo: cdr.ExtraInfo,
|
||||
SetupTime: cdr.SetupTime, AnswerTime: cdr.AnswerTime, Usage: cdr.Usage.Seconds(), Pdd: cdr.Pdd.Seconds(), Supplier: cdr.Supplier, DisconnectCause: cdr.DisconnectCause,
|
||||
Cost: cdr.Cost, ExtraInfo: cdr.ExtraInfo,
|
||||
UpdatedAt: time.Now()})
|
||||
if updated.Error != nil {
|
||||
tx.Rollback()
|
||||
|
||||
@@ -800,7 +800,7 @@ func TestPSQLGetStoredCdrs(t *testing.T) {
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
}
|
||||
// Filter on ignoreDerived
|
||||
if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnDerived: true}); err != nil {
|
||||
if storedCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{AnswerTimeStart: &timeStart, AnswerTimeEnd: &timeEnd, FilterOnRated: true}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(storedCdrs) != 0 { // ToDo: Recheck this value
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
@@ -842,3 +842,80 @@ func TestPSQLRemStoredCdrs(t *testing.T) {
|
||||
t.Error("Unexpected number of StoredCdrs returned: ", storedCdrs)
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure that what we get is what we set
|
||||
func TestPSQLStoreRestoreCdr(t *testing.T) {
|
||||
if !*testLocal {
|
||||
return
|
||||
}
|
||||
strCdr := &StoredCdr{TOR: utils.VOICE, AccId: "ccc1", CdrHost: "192.168.1.1", CdrSource: "TEST_CDR", ReqType: utils.META_RATED,
|
||||
Direction: "*out", Tenant: "cgrates.org", Category: "call", Account: "1001", Subject: "1001", Destination: "1002",
|
||||
SetupTime: time.Date(2013, 12, 7, 8, 42, 24, 0, time.UTC), AnswerTime: time.Date(2013, 12, 7, 8, 42, 26, 0, time.UTC),
|
||||
Usage: time.Duration(10) * time.Second, Pdd: time.Duration(3) * time.Second, Supplier: "SUPPL1",
|
||||
ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"},
|
||||
MediationRunId: utils.DEFAULT_RUNID, Cost: 1.201}
|
||||
strCdr.CgrId = utils.Sha1(strCdr.AccId, strCdr.SetupTime.String())
|
||||
if err := psqlDb.SetCdr(strCdr); err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
if err := psqlDb.SetRatedCdr(strCdr); err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
// Check RawCdr
|
||||
if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(rcvCdrs) != 1 {
|
||||
t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs)
|
||||
} else {
|
||||
rcvCdr := rcvCdrs[0]
|
||||
if strCdr.CgrId != rcvCdr.CgrId ||
|
||||
strCdr.TOR != rcvCdr.TOR ||
|
||||
strCdr.AccId != rcvCdr.AccId ||
|
||||
strCdr.CdrHost != rcvCdr.CdrHost ||
|
||||
strCdr.ReqType != rcvCdr.ReqType ||
|
||||
strCdr.Direction != rcvCdr.Direction ||
|
||||
strCdr.Tenant != rcvCdr.Tenant ||
|
||||
strCdr.Category != rcvCdr.Category ||
|
||||
strCdr.Account != rcvCdr.Account ||
|
||||
strCdr.Subject != rcvCdr.Subject ||
|
||||
strCdr.Destination != rcvCdr.Destination ||
|
||||
!strCdr.SetupTime.Equal(rcvCdr.SetupTime) ||
|
||||
!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) ||
|
||||
strCdr.Usage != rcvCdr.Usage ||
|
||||
strCdr.Pdd != rcvCdr.Pdd ||
|
||||
strCdr.Supplier != rcvCdr.Supplier ||
|
||||
strCdr.DisconnectCause != rcvCdr.DisconnectCause ||
|
||||
!reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0])
|
||||
}
|
||||
}
|
||||
// Check RatedCdr
|
||||
if rcvCdrs, _, err := psqlDb.GetStoredCdrs(&utils.CdrsFilter{CgrIds: []string{strCdr.CgrId}, FilterOnRated: true}); err != nil {
|
||||
t.Error(err.Error())
|
||||
} else if len(rcvCdrs) != 1 {
|
||||
t.Errorf("Unexpected cdrs returned: %+v", rcvCdrs)
|
||||
} else {
|
||||
rcvCdr := rcvCdrs[0]
|
||||
if strCdr.CgrId != rcvCdr.CgrId ||
|
||||
strCdr.TOR != rcvCdr.TOR ||
|
||||
strCdr.AccId != rcvCdr.AccId ||
|
||||
strCdr.CdrHost != rcvCdr.CdrHost ||
|
||||
strCdr.ReqType != rcvCdr.ReqType ||
|
||||
strCdr.Direction != rcvCdr.Direction ||
|
||||
strCdr.Tenant != rcvCdr.Tenant ||
|
||||
strCdr.Category != rcvCdr.Category ||
|
||||
strCdr.Account != rcvCdr.Account ||
|
||||
strCdr.Subject != rcvCdr.Subject ||
|
||||
strCdr.Destination != rcvCdr.Destination ||
|
||||
//!strCdr.SetupTime.Equal(rcvCdr.SetupTime) || // FixMe
|
||||
//!strCdr.AnswerTime.Equal(rcvCdr.AnswerTime) || // FixMe
|
||||
strCdr.Usage != rcvCdr.Usage ||
|
||||
strCdr.Pdd != rcvCdr.Pdd ||
|
||||
strCdr.Supplier != rcvCdr.Supplier ||
|
||||
strCdr.DisconnectCause != rcvCdr.DisconnectCause ||
|
||||
strCdr.Cost != rcvCdr.Cost ||
|
||||
!reflect.DeepEqual(strCdr.ExtraFields, rcvCdr.ExtraFields) {
|
||||
t.Errorf("Expecting: %+v, received: %+v", strCdr, rcvCdrs[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -742,6 +742,7 @@ func (self *SQLStorage) SetCdr(cdr *StoredCdr) error {
|
||||
SetupTime: cdr.SetupTime,
|
||||
AnswerTime: cdr.AnswerTime,
|
||||
Usage: cdr.Usage.Seconds(),
|
||||
Pdd: cdr.Pdd.Seconds(),
|
||||
Supplier: cdr.Supplier,
|
||||
DisconnectCause: cdr.DisconnectCause,
|
||||
CreatedAt: time.Now()})
|
||||
@@ -766,16 +767,16 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
var cdrs []*StoredCdr
|
||||
// Select string
|
||||
var selectStr string
|
||||
if qryFltr.FilterOnDerived { // We use different tables to query account data in case of derived
|
||||
selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans",
|
||||
utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS,
|
||||
if qryFltr.FilterOnRated { // We use different tables to query account data in case of derived
|
||||
selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.pdd,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans",
|
||||
utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS,
|
||||
utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS,
|
||||
utils.TBL_CDRS_EXTRA, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS,
|
||||
utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS)
|
||||
} else {
|
||||
selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans",
|
||||
utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY,
|
||||
selectStr = fmt.Sprintf("%s.cgrid,%s.id,%s.tor,%s.accid,%s.cdrhost,%s.cdrsource,%s.reqtype,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.setup_time,%s.answer_time,%s.usage,%s.pdd,%s.supplier,%s.disconnect_cause,%s.extra_fields,%s.runid,%s.cost,%s.tor,%s.direction,%s.tenant,%s.category,%s.account,%s.subject,%s.destination,%s.cost,%s.timespans",
|
||||
utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY,
|
||||
utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY, utils.TBL_CDRS_PRIMARY,
|
||||
utils.TBL_CDRS_EXTRA, utils.TBL_RATED_CDRS, utils.TBL_RATED_CDRS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS,
|
||||
utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS, utils.TBL_COST_DETAILS)
|
||||
|
||||
@@ -821,91 +822,91 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
}
|
||||
if len(qryFltr.ReqTypes) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".reqtype in (?)", qryFltr.ReqTypes)
|
||||
}
|
||||
if len(qryFltr.NotReqTypes) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".reqtype not in (?)", qryFltr.NotReqTypes)
|
||||
}
|
||||
if len(qryFltr.Directions) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".direction in (?)", qryFltr.Directions)
|
||||
}
|
||||
if len(qryFltr.NotDirections) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".direction not in (?)", qryFltr.NotDirections)
|
||||
}
|
||||
if len(qryFltr.Tenants) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".tenant in (?)", qryFltr.Tenants)
|
||||
}
|
||||
if len(qryFltr.NotTenants) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".tenant not in (?)", qryFltr.NotTenants)
|
||||
}
|
||||
if len(qryFltr.Categories) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".category in (?)", qryFltr.Categories)
|
||||
}
|
||||
if len(qryFltr.NotCategories) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".category not in (?)", qryFltr.NotCategories)
|
||||
}
|
||||
if len(qryFltr.Accounts) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".account in (?)", qryFltr.Accounts)
|
||||
}
|
||||
if len(qryFltr.NotAccounts) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".account not in (?)", qryFltr.NotAccounts)
|
||||
}
|
||||
if len(qryFltr.Subjects) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".subject in (?)", qryFltr.Subjects)
|
||||
}
|
||||
if len(qryFltr.NotSubjects) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".subject not in (?)", qryFltr.NotSubjects)
|
||||
}
|
||||
if len(qryFltr.DestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
qIds := bytes.NewBufferString("(")
|
||||
@@ -920,7 +921,7 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
}
|
||||
if len(qryFltr.NotDestPrefixes) != 0 { // A bit ugly but still more readable than scopes provided by gorm
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
qIds := bytes.NewBufferString("(")
|
||||
@@ -935,28 +936,28 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
}
|
||||
if len(qryFltr.Suppliers) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".supplier in (?)", qryFltr.Subjects)
|
||||
}
|
||||
if len(qryFltr.NotSuppliers) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".supplier not in (?)", qryFltr.NotSubjects)
|
||||
}
|
||||
if len(qryFltr.DisconnectCauses) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".disconnect_cause in (?)", qryFltr.DisconnectCauses)
|
||||
}
|
||||
if len(qryFltr.NotDisconnectCauses) != 0 {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".disconnect_cause not in (?)", qryFltr.NotDisconnectCauses)
|
||||
@@ -1013,70 +1014,70 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
}
|
||||
if qryFltr.SetupTimeStart != nil {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".setup_time >= ?", qryFltr.SetupTimeStart)
|
||||
}
|
||||
if qryFltr.SetupTimeEnd != nil {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".setup_time < ?", qryFltr.SetupTimeEnd)
|
||||
}
|
||||
if qryFltr.AnswerTimeStart != nil && !qryFltr.AnswerTimeStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".answer_time >= ?", qryFltr.AnswerTimeStart)
|
||||
}
|
||||
if qryFltr.AnswerTimeEnd != nil && !qryFltr.AnswerTimeEnd.IsZero() {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".answer_time < ?", qryFltr.AnswerTimeEnd)
|
||||
}
|
||||
if qryFltr.CreatedAtStart != nil && !qryFltr.CreatedAtStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".created_at >= ?", qryFltr.CreatedAtStart)
|
||||
}
|
||||
if qryFltr.CreatedAtEnd != nil && !qryFltr.CreatedAtEnd.IsZero() {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".created_at < ?", qryFltr.CreatedAtEnd)
|
||||
}
|
||||
if qryFltr.UpdatedAtStart != nil && !qryFltr.UpdatedAtStart.IsZero() { // With IsZero we keep backwards compatible with ApierV1
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".updated_at >= ?", qryFltr.UpdatedAtStart)
|
||||
}
|
||||
if qryFltr.UpdatedAtEnd != nil && !qryFltr.UpdatedAtEnd.IsZero() {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".updated_at < ?", qryFltr.UpdatedAtEnd)
|
||||
}
|
||||
if qryFltr.UsageStart != nil {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".usage >= ?", qryFltr.UsageStart)
|
||||
}
|
||||
if qryFltr.UsageEnd != nil {
|
||||
tblName := utils.TBL_CDRS_PRIMARY
|
||||
if qryFltr.FilterOnDerived {
|
||||
if qryFltr.FilterOnRated {
|
||||
tblName = utils.TBL_RATED_CDRS
|
||||
}
|
||||
q = q.Where(tblName+".usage < ?", qryFltr.UsageEnd)
|
||||
@@ -1124,11 +1125,11 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
var extraFields, ccTimespansBytes []byte
|
||||
var setupTime, answerTime mysql.NullTime
|
||||
var orderid int64
|
||||
var usage, cost, ccCost sql.NullFloat64
|
||||
var usage, pdd, cost, ccCost sql.NullFloat64
|
||||
var extraFieldsMp map[string]string
|
||||
var ccTimespans TimeSpans
|
||||
if err := rows.Scan(&cgrid, &orderid, &tor, &accid, &cdrhost, &cdrsrc, &reqtype, &direction, &tenant, &category, &account, &subject, &destination,
|
||||
&setupTime, &answerTime, &usage, &ccSupplier, &ccDisconnectCause,
|
||||
&setupTime, &answerTime, &usage, &pdd, &ccSupplier, &ccDisconnectCause,
|
||||
&extraFields, &runid, &cost, &ccTor, &ccDirection, &ccTenant, &ccCategory, &ccAccount, &ccSubject, &ccDestination, &ccCost, &ccTimespansBytes); err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
@@ -1143,11 +1144,12 @@ func (self *SQLStorage) GetStoredCdrs(qryFltr *utils.CdrsFilter) ([]*StoredCdr,
|
||||
}
|
||||
}
|
||||
usageDur, _ := time.ParseDuration(strconv.FormatFloat(usage.Float64, 'f', -1, 64) + "s")
|
||||
pddDur, _ := time.ParseDuration(strconv.FormatFloat(pdd.Float64, 'f', -1, 64) + "s")
|
||||
storCdr := &StoredCdr{
|
||||
CgrId: cgrid.String, OrderId: orderid, TOR: tor.String, AccId: accid.String, CdrHost: cdrhost.String, CdrSource: cdrsrc.String, ReqType: reqtype.String,
|
||||
Direction: direction.String, Tenant: tenant.String,
|
||||
Category: category.String, Account: account.String, Subject: subject.String, Destination: destination.String,
|
||||
SetupTime: setupTime.Time, AnswerTime: answerTime.Time, Usage: usageDur, Supplier: ccSupplier.String, DisconnectCause: ccDisconnectCause.String,
|
||||
SetupTime: setupTime.Time, AnswerTime: answerTime.Time, Usage: usageDur, Pdd: pddDur, Supplier: ccSupplier.String, DisconnectCause: ccDisconnectCause.String,
|
||||
ExtraFields: extraFieldsMp, MediationRunId: runid.String, RatedAccount: ccAccount.String, RatedSubject: ccSubject.String, Cost: cost.Float64,
|
||||
}
|
||||
if ccTimespans != nil {
|
||||
|
||||
@@ -292,7 +292,7 @@ func TestTutFsCallsCdrs(t *testing.T) {
|
||||
t.Errorf("Unexpected Usage for CDR: %+v", reply[0])
|
||||
}
|
||||
}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true}
|
||||
if err := tutFsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(reply) != 1 {
|
||||
|
||||
@@ -380,7 +380,7 @@ func TestTutKamCallsCdrs(t *testing.T) {
|
||||
t.Errorf("Unexpected Supplier for CDR: %+v", reply[0])
|
||||
}
|
||||
}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true}
|
||||
if err := tutKamCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(reply) != 2 {
|
||||
|
||||
@@ -290,7 +290,7 @@ func TestTutOsipsCallsCdrs(t *testing.T) {
|
||||
t.Errorf("Unexpected Usage for CDR: %+v", reply[0])
|
||||
}
|
||||
}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnDerived: true}
|
||||
req = utils.RpcCdrsFilter{Accounts: []string{"1001"}, RunIds: []string{"derived_run1"}, FilterOnRated: true}
|
||||
if err := tutOsipsCallsRpc.Call("ApierV2.GetCdrs", req, &reply); err != nil {
|
||||
t.Error("Unexpected error: ", err.Error())
|
||||
} else if len(reply) != 1 {
|
||||
|
||||
@@ -963,7 +963,7 @@ type CdrsFilter struct {
|
||||
UsageEnd *float64 // End of the usage interval (<)
|
||||
CostStart *float64 // Start of the cost interval (>=)
|
||||
CostEnd *float64 // End of the usage interval (<)
|
||||
FilterOnDerived bool // Do not consider derived CDRs but original one
|
||||
FilterOnRated bool // Do not consider rated CDRs but raw one
|
||||
Count bool // If true count the items instead of returning data
|
||||
Paginator
|
||||
}
|
||||
@@ -1020,7 +1020,7 @@ type RpcCdrsFilter struct {
|
||||
UsageEnd *float64 // End of the usage interval (<)
|
||||
CostStart *float64 // Start of the cost interval (>=)
|
||||
CostEnd *float64 // End of the usage interval (<)
|
||||
FilterOnDerived bool // Do not consider derived CDRs but original one
|
||||
FilterOnRated bool // Do not consider derived CDRs but original one
|
||||
Paginator // Add pagination
|
||||
}
|
||||
|
||||
@@ -1068,7 +1068,7 @@ func (self *RpcCdrsFilter) AsCdrsFilter() (*CdrsFilter, error) {
|
||||
UsageEnd: self.UsageEnd,
|
||||
CostStart: self.CostStart,
|
||||
CostEnd: self.CostEnd,
|
||||
FilterOnDerived: self.FilterOnDerived,
|
||||
FilterOnRated: self.FilterOnRated,
|
||||
Paginator: self.Paginator,
|
||||
}
|
||||
if len(self.SetupTimeStart) != 0 {
|
||||
|
||||
Reference in New Issue
Block a user