//go:build ignore package main import ( "database/sql" "encoding/json" "os" "sort" "strings" "time" _ "github.com/go-sql-driver/mysql" ) type metadataRecord struct { VIN string `json:"vin"` Plate string `json:"plate"` Brand string `json:"brand"` Model string `json:"model"` VehicleModelID int64 `json:"vehicle_model_id"` BatteryCapacityKWh float64 `json:"battery_capacity_kwh"` TankCapacityL float64 `json:"tank_capacity_l"` SourceUpdatedAt *time.Time `json:"source_updated_at,omitempty"` } func main() { if len(os.Args) != 2 { panic("usage: query_metadata ") } dsn := strings.TrimSpace(os.Getenv("MYSQL_DSN")) if dsn == "" { panic("MYSQL_DSN is required") } db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } defer db.Close() rows, err := db.Query(`SELECT UPPER(TRIM(vi.vin)),COALESCE(vi.plate_number,''), COALESCE(vm.brand,''),COALESCE(vm.model,''),vm.id,vm.battery_capacity,vm.tank_capacity, CASE WHEN vi.update_time IS NULL THEN vm.update_time WHEN vm.update_time IS NULL THEN vi.update_time ELSE GREATEST(vi.update_time,vm.update_time) END FROM ln_asset_management.vehicle_info vi JOIN ln_asset_management.vehicle_model vm ON vm.id=vi.vehicle_model_id WHERE COALESCE(vi.del_flag,'0')='0' AND COALESCE(vm.del_flag,'0')='0' AND LOWER(TRIM(vm.brand))='hyundai' AND LENGTH(TRIM(vi.vin))=17 AND vm.tank_capacity>0 AND vm.battery_capacity>0 ORDER BY vi.vin,vi.update_time DESC,vi.id DESC`) if err != nil { panic(err) } defer rows.Close() byVIN := map[string]metadataRecord{} for rows.Next() { var row metadataRecord var updated sql.NullTime if err := rows.Scan(&row.VIN, &row.Plate, &row.Brand, &row.Model, &row.VehicleModelID, &row.BatteryCapacityKWh, &row.TankCapacityL, &updated); err != nil { panic(err) } if _, exists := byVIN[row.VIN]; exists { continue } if updated.Valid { value := updated.Time row.SourceUpdatedAt = &value } byVIN[row.VIN] = row } if err := rows.Err(); err != nil { panic(err) } vins := make([]string, 0, len(byVIN)) for vin := range byVIN { vins = append(vins, vin) } sort.Strings(vins) out := make([]metadataRecord, 0, len(vins)) for _, vin := range vins { out = append(out, byVIN[vin]) } output, err := os.Create(os.Args[1]) if err != nil { panic(err) } defer output.Close() encoder := json.NewEncoder(output) encoder.SetIndent("", " ") if err := encoder.Encode(out); err != nil { panic(err) } }