765 lines
26 KiB
Go
765 lines
26 KiB
Go
package backup
|
|
|
|
import (
|
|
"database/sql"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/apache/arrow/go/v14/arrow"
|
|
"github.com/apache/arrow/go/v14/arrow/array"
|
|
"github.com/apache/arrow/go/v14/arrow/memory"
|
|
"github.com/apache/arrow/go/v14/parquet"
|
|
"github.com/apache/arrow/go/v14/parquet/compress"
|
|
"github.com/apache/arrow/go/v14/parquet/pqarrow"
|
|
)
|
|
|
|
func BackupDeliveries(sqlDB *sql.DB) (string, error) {
|
|
|
|
rows, err := sqlDB.Query(`
|
|
SELECT DISTINCT a.deliveryid,a.applocationid,f.locationname AS applocation,a.orderheaderid,a.configid,a.tenantid,a.partnerid,a.locationid,a.userid,a.categoryid,a.subcategoryid,a.moduleid,
|
|
a.orderid,a.deliverydate,a.orderstatus,a.assigntime,a.starttime,a.arrivaltime,a.pickuptime,a.deliverytime,a.canceltime,a.acceptedtime,
|
|
a.customerid,a.pickupcustomer,a.pickupcontactno,a.pickuplocationid,a.pickupaddress,a.pickuplocation,a.pickuplat,a.pickuplon,
|
|
a.deliverycustomerid,a.deliverycustomer,a.deliverycontactno,a.deliverylocationid,a.deliveryaddress,a.deliverylocation,
|
|
a.droplat,a.droplon,a.deliverylat,a.deliverylong,
|
|
a.riderslat,a.riderslon,a.deliveryamt,a.kms,a.actualkms,a.riderkms,a.deliverycharges,a.deliverytype,a.paymenttype,a.smsdelivery,a.quantity,a.collectionamt,a.collectedamt,a.collectionstatus,
|
|
a.notes,a.ordernotes,a.step,a.eta,a.previouskms,a.cumulativekms,a.ridertime,b.tenantname,b.primarycontact as tenantcontactno,b.tenanttoken,b.suburb as tenantsuburb,b.city as tenantcity,
|
|
b.address AS tenantaddress, CONCAT(c.firstname, ' ', c.lastname) AS ridername,c.userfcmtoken,c.contactno as ridercontact,e.locationname,e.suburb AS locationsuburb,e.contactno AS locationcontactno,e.address AS locationaddress,
|
|
h.slab, h.pricingdate, h.baseprice, h.minkm, h.priceperkm, h.maxkm, h.orders, h.othercharges, h.surgecharges
|
|
FROM deliveries a
|
|
INNER JOIN tenants b ON a.tenantid=b.tenantid
|
|
INNER JOIN app_users c ON a.userid=c.userid
|
|
INNER JOIN tenantlocations e ON a.locationid=e.locationid
|
|
INNER JOIN app_location f ON a.applocationid = f.applocationid
|
|
INNER JOIN app_locationconfig g ON f.applocationid = g.applocationid
|
|
LEFT JOIN tenantpricing h ON a.tenantid = h.tenantid
|
|
WHERE a.deliverydate >= NOW() - INTERVAL '3 months'
|
|
`)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer rows.Close()
|
|
|
|
// ✅ REAL schema (no placeholders)
|
|
schema := arrow.NewSchema([]arrow.Field{
|
|
{Name: "deliveryid", Type: arrow.PrimitiveTypes.Int32},
|
|
|
|
{Name: "applocationid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "applocation", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "orderheaderid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "configid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "tenantid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "partnerid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "locationid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "userid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "categoryid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "subcategoryid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "moduleid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
|
|
{Name: "orderid", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverydate", Type: arrow.FixedWidthTypes.Timestamp_ms, Nullable: true},
|
|
{Name: "orderstatus", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "assigntime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "starttime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "arrivaltime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickuptime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverytime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "canceltime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "acceptedtime", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "customerid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "pickupcustomer", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickupcontactno", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickuplocationid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "pickupaddress", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickuplocation", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickuplat", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pickuplon", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "deliverycustomerid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "deliverycustomer", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverycontactno", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverylocationid", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "deliveryaddress", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverylocation", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "droplat", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "droplon", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverylat", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverylong", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "riderslat", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "riderslon", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliveryamt", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "kms", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "actualkms", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "riderkms", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "deliverycharges", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "deliverytype", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "paymenttype", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "smsdelivery", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "quantity", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "collectionamt", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "collectedamt", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "collectionstatus", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
|
|
{Name: "notes", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "ordernotes", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "step", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "eta", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "previouskms", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "cumulativekms", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "ridertime", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
|
|
{Name: "tenantname", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "tenantcontactno", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "tenanttoken", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "tenantsuburb", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "tenantcity", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "tenantaddress", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "ridername", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "userfcmtoken", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "ridercontact", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "locationname", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "locationsuburb", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "locationcontactno", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "locationaddress", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
|
|
{Name: "slab", Type: arrow.BinaryTypes.String, Nullable: true},
|
|
{Name: "pricingdate", Type: arrow.FixedWidthTypes.Timestamp_ms, Nullable: true},
|
|
{Name: "baseprice", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "minkm", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "priceperkm", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "maxkm", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "orders", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
|
|
{Name: "othercharges", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
{Name: "surgecharges", Type: arrow.PrimitiveTypes.Float64, Nullable: true},
|
|
}, nil)
|
|
|
|
pool := memory.NewGoAllocator()
|
|
builder := array.NewRecordBuilder(pool, schema)
|
|
defer builder.Release()
|
|
|
|
for rows.Next() {
|
|
|
|
var (
|
|
deliveryid int32
|
|
orderheaderid, configid, applocationid sql.NullInt32
|
|
tenantid, locationid, partnerid, moduleid, userid sql.NullInt32
|
|
categoryid, subcategoryid sql.NullInt32
|
|
orderid, orderstatus, assigntime, starttime sql.NullString
|
|
arrivaltime, pickuptime, acceptedtime, deliverytime sql.NullString
|
|
canceltime sql.NullString
|
|
|
|
customerid, pickuplocationid sql.NullInt32
|
|
pickupcustomer, pickupaddress, pickuplocation sql.NullString
|
|
pickupcontactno, pickuplat, pickuplon sql.NullString
|
|
deliverycustomerid, deliverylocationid sql.NullInt32
|
|
deliverycustomer, deliverycontactno, deliveryaddress sql.NullString
|
|
deliverylocation, droplat, droplon sql.NullString
|
|
deliverylat, deliverylong, riderslat, riderslon sql.NullString
|
|
|
|
kms, riderkms, actualkms sql.NullString
|
|
deliverycharges, deliveryamt sql.NullFloat64
|
|
notes, deliverytype, ordernotes sql.NullString
|
|
paymenttype sql.NullInt32
|
|
|
|
smsdelivery sql.NullInt32
|
|
previouskms, cumulativekms, step, quantity sql.NullInt32
|
|
collectionamt, collectedamt sql.NullFloat64
|
|
collectionstatus sql.NullInt32
|
|
eta sql.NullString
|
|
ridertime sql.NullInt32
|
|
deliverydate sql.NullTime
|
|
|
|
applocation sql.NullString
|
|
|
|
tenantname, tenantcontactno, tenanttoken sql.NullString
|
|
tenantsuburb, tenantcity, tenantaddress sql.NullString
|
|
|
|
ridername, userfcmtoken, ridercontact sql.NullString
|
|
|
|
locationname, locationsuburb sql.NullString
|
|
locationcontactno, locationaddress sql.NullString
|
|
|
|
slab sql.NullString
|
|
pricingdate sql.NullTime
|
|
baseprice, minkm, priceperkm, maxkm sql.NullFloat64
|
|
pricingorders sql.NullInt32
|
|
othercharges, surgecharges sql.NullFloat64
|
|
)
|
|
|
|
if err := rows.Scan(
|
|
&deliveryid, &applocationid, &applocation,
|
|
&orderheaderid, &configid, &tenantid, &partnerid,
|
|
&locationid, &userid, &categoryid, &subcategoryid, &moduleid,
|
|
|
|
&orderid, &deliverydate, &orderstatus,
|
|
&assigntime, &starttime, &arrivaltime, &pickuptime,
|
|
&deliverytime, &canceltime, &acceptedtime,
|
|
|
|
&customerid, &pickupcustomer, &pickupcontactno,
|
|
&pickuplocationid, &pickupaddress, &pickuplocation,
|
|
&pickuplat, &pickuplon,
|
|
|
|
&deliverycustomerid, &deliverycustomer, &deliverycontactno,
|
|
&deliverylocationid, &deliveryaddress, &deliverylocation,
|
|
&droplat, &droplon, &deliverylat, &deliverylong,
|
|
|
|
&riderslat, &riderslon,
|
|
&deliveryamt, &kms, &actualkms, &riderkms,
|
|
&deliverycharges, &deliverytype, &paymenttype,
|
|
&smsdelivery, &quantity, &collectionamt,
|
|
&collectedamt, &collectionstatus,
|
|
|
|
¬es, &ordernotes, &step, &eta,
|
|
&previouskms, &cumulativekms, &ridertime,
|
|
|
|
&tenantname, &tenantcontactno, &tenanttoken,
|
|
&tenantsuburb, &tenantcity, &tenantaddress,
|
|
|
|
&ridername, &userfcmtoken, &ridercontact,
|
|
|
|
&locationname, &locationsuburb, &locationcontactno, &locationaddress,
|
|
|
|
&slab, &pricingdate, &baseprice, &minkm,
|
|
&priceperkm, &maxkm, &pricingorders,
|
|
&othercharges, &surgecharges,
|
|
); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// ✅ Append safely
|
|
builder.Field(0).(*array.Int32Builder).Append(deliveryid)
|
|
|
|
if applocationid.Valid {
|
|
builder.Field(1).(*array.Int32Builder).Append(applocationid.Int32)
|
|
} else {
|
|
builder.Field(1).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if applocation.Valid {
|
|
builder.Field(2).(*array.StringBuilder).Append(applocation.String)
|
|
} else {
|
|
builder.Field(2).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if orderheaderid.Valid {
|
|
builder.Field(3).(*array.Int32Builder).Append(orderheaderid.Int32)
|
|
} else {
|
|
builder.Field(3).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if configid.Valid {
|
|
builder.Field(4).(*array.Int32Builder).Append(configid.Int32)
|
|
} else {
|
|
builder.Field(4).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if tenantid.Valid {
|
|
builder.Field(5).(*array.Int32Builder).Append(tenantid.Int32)
|
|
} else {
|
|
builder.Field(5).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if partnerid.Valid {
|
|
builder.Field(6).(*array.Int32Builder).Append(partnerid.Int32)
|
|
} else {
|
|
builder.Field(6).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if locationid.Valid {
|
|
builder.Field(7).(*array.Int32Builder).Append(locationid.Int32)
|
|
} else {
|
|
builder.Field(7).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if userid.Valid {
|
|
builder.Field(8).(*array.Int32Builder).Append(userid.Int32)
|
|
} else {
|
|
builder.Field(8).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if categoryid.Valid {
|
|
builder.Field(9).(*array.Int32Builder).Append(categoryid.Int32)
|
|
} else {
|
|
builder.Field(9).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if subcategoryid.Valid {
|
|
builder.Field(10).(*array.Int32Builder).Append(subcategoryid.Int32)
|
|
} else {
|
|
builder.Field(10).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if moduleid.Valid {
|
|
builder.Field(11).(*array.Int32Builder).Append(moduleid.Int32)
|
|
} else {
|
|
builder.Field(11).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if orderid.Valid {
|
|
builder.Field(12).(*array.StringBuilder).Append(orderid.String)
|
|
} else {
|
|
builder.Field(12).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverydate.Valid {
|
|
builder.Field(13).(*array.TimestampBuilder).
|
|
Append(arrow.Timestamp(deliverydate.Time.UnixMilli()))
|
|
} else {
|
|
builder.Field(13).(*array.TimestampBuilder).AppendNull()
|
|
}
|
|
|
|
if orderstatus.Valid {
|
|
builder.Field(14).(*array.StringBuilder).Append(orderstatus.String)
|
|
} else {
|
|
builder.Field(14).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if assigntime.Valid {
|
|
builder.Field(15).(*array.StringBuilder).Append(assigntime.String)
|
|
} else {
|
|
builder.Field(15).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if starttime.Valid {
|
|
builder.Field(16).(*array.StringBuilder).Append(starttime.String)
|
|
} else {
|
|
builder.Field(16).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if arrivaltime.Valid {
|
|
builder.Field(17).(*array.StringBuilder).Append(arrivaltime.String)
|
|
} else {
|
|
builder.Field(17).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickuptime.Valid {
|
|
builder.Field(18).(*array.StringBuilder).Append(pickuptime.String)
|
|
} else {
|
|
builder.Field(18).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverytime.Valid {
|
|
builder.Field(19).(*array.StringBuilder).Append(deliverytime.String)
|
|
} else {
|
|
builder.Field(19).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if canceltime.Valid {
|
|
builder.Field(20).(*array.StringBuilder).Append(canceltime.String)
|
|
} else {
|
|
builder.Field(20).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if acceptedtime.Valid {
|
|
builder.Field(21).(*array.StringBuilder).Append(acceptedtime.String)
|
|
} else {
|
|
builder.Field(21).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if customerid.Valid {
|
|
builder.Field(22).(*array.Int32Builder).Append(customerid.Int32)
|
|
} else {
|
|
builder.Field(22).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if pickupcustomer.Valid {
|
|
builder.Field(23).(*array.StringBuilder).Append(pickupcustomer.String)
|
|
} else {
|
|
builder.Field(23).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickupcontactno.Valid {
|
|
builder.Field(24).(*array.StringBuilder).Append(pickupcontactno.String)
|
|
} else {
|
|
builder.Field(24).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickuplocationid.Valid {
|
|
builder.Field(25).(*array.Int32Builder).Append(pickuplocationid.Int32)
|
|
} else {
|
|
builder.Field(25).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if pickupaddress.Valid {
|
|
builder.Field(26).(*array.StringBuilder).Append(pickupaddress.String)
|
|
} else {
|
|
builder.Field(26).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickuplocation.Valid {
|
|
builder.Field(27).(*array.StringBuilder).Append(pickuplocation.String)
|
|
} else {
|
|
builder.Field(27).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickuplat.Valid {
|
|
builder.Field(28).(*array.StringBuilder).Append(pickuplat.String)
|
|
} else {
|
|
builder.Field(28).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pickuplon.Valid {
|
|
builder.Field(29).(*array.StringBuilder).Append(pickuplon.String)
|
|
} else {
|
|
builder.Field(29).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverycustomerid.Valid {
|
|
builder.Field(30).(*array.Int32Builder).Append(deliverycustomerid.Int32)
|
|
} else {
|
|
builder.Field(30).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if deliverycustomer.Valid {
|
|
builder.Field(31).(*array.StringBuilder).Append(deliverycustomer.String)
|
|
} else {
|
|
builder.Field(31).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverycontactno.Valid {
|
|
builder.Field(32).(*array.StringBuilder).Append(deliverycontactno.String)
|
|
} else {
|
|
builder.Field(32).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverylocationid.Valid {
|
|
builder.Field(33).(*array.Int32Builder).Append(deliverylocationid.Int32)
|
|
} else {
|
|
builder.Field(33).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if deliveryaddress.Valid {
|
|
builder.Field(34).(*array.StringBuilder).Append(deliveryaddress.String)
|
|
} else {
|
|
builder.Field(34).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverylocation.Valid {
|
|
builder.Field(35).(*array.StringBuilder).Append(deliverylocation.String)
|
|
} else {
|
|
builder.Field(35).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if droplat.Valid {
|
|
builder.Field(36).(*array.StringBuilder).Append(droplat.String)
|
|
} else {
|
|
builder.Field(36).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if droplon.Valid {
|
|
builder.Field(37).(*array.StringBuilder).Append(droplon.String)
|
|
} else {
|
|
builder.Field(37).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverylat.Valid {
|
|
builder.Field(38).(*array.StringBuilder).Append(deliverylat.String)
|
|
} else {
|
|
builder.Field(38).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverylong.Valid {
|
|
builder.Field(39).(*array.StringBuilder).Append(deliverylong.String)
|
|
} else {
|
|
builder.Field(39).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if riderslat.Valid {
|
|
builder.Field(40).(*array.StringBuilder).Append(riderslat.String)
|
|
} else {
|
|
builder.Field(40).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if riderslon.Valid {
|
|
builder.Field(41).(*array.StringBuilder).Append(riderslon.String)
|
|
} else {
|
|
builder.Field(41).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliveryamt.Valid {
|
|
builder.Field(42).(*array.Float64Builder).Append(deliveryamt.Float64)
|
|
} else {
|
|
builder.Field(42).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if kms.Valid {
|
|
builder.Field(43).(*array.StringBuilder).Append(kms.String)
|
|
} else {
|
|
builder.Field(43).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if actualkms.Valid {
|
|
builder.Field(44).(*array.StringBuilder).Append(actualkms.String)
|
|
} else {
|
|
builder.Field(44).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if riderkms.Valid {
|
|
builder.Field(45).(*array.StringBuilder).Append(riderkms.String)
|
|
} else {
|
|
builder.Field(45).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if deliverycharges.Valid {
|
|
builder.Field(46).(*array.Float64Builder).Append(deliverycharges.Float64)
|
|
} else {
|
|
builder.Field(46).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if deliverytype.Valid {
|
|
builder.Field(47).(*array.StringBuilder).Append(deliverytype.String)
|
|
} else {
|
|
builder.Field(47).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if paymenttype.Valid {
|
|
builder.Field(48).(*array.Int32Builder).Append(paymenttype.Int32)
|
|
} else {
|
|
builder.Field(48).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if smsdelivery.Valid {
|
|
builder.Field(49).(*array.Int32Builder).Append(smsdelivery.Int32)
|
|
} else {
|
|
builder.Field(49).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if quantity.Valid {
|
|
builder.Field(50).(*array.Int32Builder).Append(quantity.Int32)
|
|
} else {
|
|
builder.Field(50).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if collectionamt.Valid {
|
|
builder.Field(51).(*array.Float64Builder).Append(collectionamt.Float64)
|
|
} else {
|
|
builder.Field(51).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if collectedamt.Valid {
|
|
builder.Field(52).(*array.Float64Builder).Append(collectedamt.Float64)
|
|
} else {
|
|
builder.Field(52).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if collectionstatus.Valid {
|
|
builder.Field(53).(*array.Int32Builder).Append(collectionstatus.Int32)
|
|
} else {
|
|
builder.Field(53).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if notes.Valid {
|
|
builder.Field(54).(*array.StringBuilder).Append(notes.String)
|
|
} else {
|
|
builder.Field(54).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if ordernotes.Valid {
|
|
builder.Field(55).(*array.StringBuilder).Append(ordernotes.String)
|
|
} else {
|
|
builder.Field(55).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if step.Valid {
|
|
builder.Field(56).(*array.Int32Builder).Append(step.Int32)
|
|
} else {
|
|
builder.Field(56).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if eta.Valid {
|
|
builder.Field(57).(*array.StringBuilder).Append(eta.String)
|
|
} else {
|
|
builder.Field(57).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if previouskms.Valid {
|
|
builder.Field(58).(*array.Int32Builder).Append(previouskms.Int32)
|
|
} else {
|
|
builder.Field(58).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if cumulativekms.Valid {
|
|
builder.Field(59).(*array.Int32Builder).Append(cumulativekms.Int32)
|
|
} else {
|
|
builder.Field(59).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if ridertime.Valid {
|
|
builder.Field(60).(*array.Int32Builder).Append(ridertime.Int32)
|
|
} else {
|
|
builder.Field(60).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if tenantname.Valid {
|
|
builder.Field(61).(*array.StringBuilder).Append(tenantname.String)
|
|
} else {
|
|
builder.Field(61).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if tenantcontactno.Valid {
|
|
builder.Field(62).(*array.StringBuilder).Append(tenantcontactno.String)
|
|
} else {
|
|
builder.Field(62).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if tenanttoken.Valid {
|
|
builder.Field(63).(*array.StringBuilder).Append(tenanttoken.String)
|
|
} else {
|
|
builder.Field(63).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if tenantsuburb.Valid {
|
|
builder.Field(64).(*array.StringBuilder).Append(tenantsuburb.String)
|
|
} else {
|
|
builder.Field(64).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if tenantcity.Valid {
|
|
builder.Field(65).(*array.StringBuilder).Append(tenantcity.String)
|
|
} else {
|
|
builder.Field(65).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if tenantaddress.Valid {
|
|
builder.Field(66).(*array.StringBuilder).Append(tenantaddress.String)
|
|
} else {
|
|
builder.Field(66).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if ridername.Valid {
|
|
builder.Field(67).(*array.StringBuilder).Append(ridername.String)
|
|
} else {
|
|
builder.Field(67).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if userfcmtoken.Valid {
|
|
builder.Field(68).(*array.StringBuilder).Append(userfcmtoken.String)
|
|
} else {
|
|
builder.Field(68).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if ridercontact.Valid {
|
|
builder.Field(69).(*array.StringBuilder).Append(ridercontact.String)
|
|
} else {
|
|
builder.Field(69).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if locationname.Valid {
|
|
builder.Field(70).(*array.StringBuilder).Append(locationname.String)
|
|
} else {
|
|
builder.Field(70).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if locationsuburb.Valid {
|
|
builder.Field(71).(*array.StringBuilder).Append(locationsuburb.String)
|
|
} else {
|
|
builder.Field(71).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if locationcontactno.Valid {
|
|
builder.Field(72).(*array.StringBuilder).Append(locationcontactno.String)
|
|
} else {
|
|
builder.Field(72).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if locationaddress.Valid {
|
|
builder.Field(73).(*array.StringBuilder).Append(locationaddress.String)
|
|
} else {
|
|
builder.Field(73).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if slab.Valid {
|
|
builder.Field(74).(*array.StringBuilder).Append(slab.String)
|
|
} else {
|
|
builder.Field(74).(*array.StringBuilder).AppendNull()
|
|
}
|
|
|
|
if pricingdate.Valid {
|
|
builder.Field(75).(*array.TimestampBuilder).
|
|
Append(arrow.Timestamp(pricingdate.Time.UnixMilli()))
|
|
} else {
|
|
builder.Field(75).(*array.TimestampBuilder).AppendNull()
|
|
}
|
|
|
|
if baseprice.Valid {
|
|
builder.Field(76).(*array.Float64Builder).Append(baseprice.Float64)
|
|
} else {
|
|
builder.Field(76).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if minkm.Valid {
|
|
builder.Field(77).(*array.Float64Builder).Append(minkm.Float64)
|
|
} else {
|
|
builder.Field(77).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if priceperkm.Valid {
|
|
builder.Field(78).(*array.Float64Builder).Append(priceperkm.Float64)
|
|
} else {
|
|
builder.Field(78).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if maxkm.Valid {
|
|
builder.Field(79).(*array.Float64Builder).Append(maxkm.Float64)
|
|
} else {
|
|
builder.Field(79).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if pricingorders.Valid {
|
|
builder.Field(80).(*array.Int32Builder).Append(pricingorders.Int32)
|
|
} else {
|
|
builder.Field(80).(*array.Int32Builder).AppendNull()
|
|
}
|
|
|
|
if othercharges.Valid {
|
|
builder.Field(81).(*array.Float64Builder).Append(othercharges.Float64)
|
|
} else {
|
|
builder.Field(81).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
if surgecharges.Valid {
|
|
builder.Field(82).(*array.Float64Builder).Append(surgecharges.Float64)
|
|
} else {
|
|
builder.Field(82).(*array.Float64Builder).AppendNull()
|
|
}
|
|
|
|
}
|
|
record := builder.NewRecord()
|
|
defer record.Release()
|
|
|
|
_ = os.MkdirAll("backups/parquet/deliveries", 0755)
|
|
|
|
filePath := "backups/parquet/deliveries/deliveries_" +
|
|
time.Now().Format("2006_01_02") + ".parquet"
|
|
|
|
file, err := os.Create(filePath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer file.Close()
|
|
|
|
parquetProps := parquet.NewWriterProperties(
|
|
parquet.WithCompression(compress.Codecs.Snappy),
|
|
)
|
|
|
|
writer, err := pqarrow.NewFileWriter(
|
|
schema,
|
|
file,
|
|
parquetProps,
|
|
pqarrow.ArrowWriterProperties{},
|
|
)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer writer.Close()
|
|
|
|
if err := writer.Write(record); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return filePath, nil
|
|
}
|