fix: verify raw freshness by received time
This commit is contained in:
@@ -23,6 +23,7 @@ type RawFrameQuery struct {
|
||||
Phone string
|
||||
DeviceID string
|
||||
MessageID string
|
||||
OrderBy string
|
||||
DateFrom string
|
||||
DateTo string
|
||||
Limit int
|
||||
@@ -366,6 +367,7 @@ func normalizeRawFrameQuery(query RawFrameQuery) RawFrameQuery {
|
||||
query.Phone = strings.TrimSpace(query.Phone)
|
||||
query.DeviceID = strings.TrimSpace(query.DeviceID)
|
||||
query.MessageID = strings.TrimSpace(query.MessageID)
|
||||
query.OrderBy = normalizeRawFrameOrderBy(query.OrderBy)
|
||||
query.DateFrom = normalizeDateTimeLiteral(query.DateFrom)
|
||||
query.DateTo = normalizeDateTimeLiteral(query.DateTo)
|
||||
if query.Limit <= 0 {
|
||||
@@ -408,7 +410,7 @@ func buildRawFrameSQL(table string, query RawFrameQuery) (string, []any) {
|
||||
if len(where) > 0 {
|
||||
sqlText += " WHERE " + strings.Join(where, " AND ")
|
||||
}
|
||||
sqlText += " ORDER BY ts DESC LIMIT " + strconv.Itoa(query.Limit) + " OFFSET " + strconv.Itoa(query.Offset)
|
||||
sqlText += " ORDER BY " + rawFrameOrderColumn(query.OrderBy) + " DESC LIMIT " + strconv.Itoa(query.Limit) + " OFFSET " + strconv.Itoa(query.Offset)
|
||||
return sqlText, nil
|
||||
}
|
||||
|
||||
@@ -490,6 +492,23 @@ func rawFrameWhere(query RawFrameQuery) []string {
|
||||
return where
|
||||
}
|
||||
|
||||
func normalizeRawFrameOrderBy(value string) string {
|
||||
value = strings.ToLower(strings.TrimSpace(value))
|
||||
switch value {
|
||||
case "receivedat", "received_at":
|
||||
return "receivedAt"
|
||||
default:
|
||||
return "ts"
|
||||
}
|
||||
}
|
||||
|
||||
func rawFrameOrderColumn(value string) string {
|
||||
if normalizeRawFrameOrderBy(value) == "receivedAt" {
|
||||
return "received_at"
|
||||
}
|
||||
return "ts"
|
||||
}
|
||||
|
||||
func locationWhere(query LocationQuery) []string {
|
||||
var where []string
|
||||
add := func(clause string) {
|
||||
@@ -697,6 +716,7 @@ func parseRawFrameQuery(r *http.Request) (RawFrameQuery, error) {
|
||||
Phone: values.Get("phone"),
|
||||
DeviceID: values.Get("deviceId"),
|
||||
MessageID: values.Get("messageId"),
|
||||
OrderBy: values.Get("orderBy"),
|
||||
DateFrom: values.Get("dateFrom"),
|
||||
DateTo: values.Get("dateTo"),
|
||||
Limit: limit,
|
||||
|
||||
@@ -370,3 +370,17 @@ func TestBuildRawFrameSQLUsesLiteralsForTDengine(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildRawFrameSQLCanOrderByReceivedAt(t *testing.T) {
|
||||
sqlText, args := buildRawFrameSQL("lingniu_vehicle_ts.raw_frames", RawFrameQuery{
|
||||
Protocol: "JT808",
|
||||
OrderBy: "receivedAt",
|
||||
Limit: 1,
|
||||
})
|
||||
if len(args) != 0 {
|
||||
t.Fatalf("expected no query args for TDengine, got %#v", args)
|
||||
}
|
||||
if !strings.Contains(sqlText, "ORDER BY received_at DESC LIMIT 1 OFFSET 0") {
|
||||
t.Fatalf("sql should order by received_at: %s", sqlText)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user