intial commit
This commit is contained in:
764
internal/backup/mysql_to_parquet_deliveries.go
Normal file
764
internal/backup/mysql_to_parquet_deliveries.go
Normal file
@@ -0,0 +1,764 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user