Remove limits that nobody ever asked for
This commit is contained in:
@@ -153,7 +153,7 @@ func (db *DBWrapper) QueryTimeByMonth(ctx context.Context, filters AnalyticsFilt
|
||||
}
|
||||
|
||||
// Location aggregation queries
|
||||
func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters AnalyticsFilters, limit int) ([]LocationAggregationBySystem, error) {
|
||||
func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationBySystem, error) {
|
||||
flog := logger.Default.WithPrefix("QueryLocationBySystem")
|
||||
whereClause, args := buildWhereClause(filters)
|
||||
|
||||
@@ -169,8 +169,7 @@ func (db *DBWrapper) QueryLocationBySystem(ctx context.Context, filters Analytic
|
||||
%s
|
||||
GROUP BY solar_system_name, region_name, security
|
||||
ORDER BY kill_count DESC
|
||||
LIMIT %d
|
||||
`, whereClause, limit)
|
||||
`, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -296,7 +295,7 @@ func (db *DBWrapper) QueryLocationBySecurity(ctx context.Context, filters Analyt
|
||||
}
|
||||
|
||||
// Ship aggregation queries
|
||||
func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFilters, limit int) ([]ShipAggregationByVictimShip, error) {
|
||||
func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByVictimShip, error) {
|
||||
flog := logger.Default.WithPrefix("QueryShipByVictim")
|
||||
whereClause, args := buildWhereClause(filters)
|
||||
|
||||
@@ -311,8 +310,7 @@ func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFil
|
||||
%s
|
||||
GROUP BY victim_ship_type_name, victim_ship_group_name, victim_ship_category_name
|
||||
ORDER BY kill_count DESC
|
||||
LIMIT %d
|
||||
`, whereClause, limit)
|
||||
`, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -332,7 +330,7 @@ func (db *DBWrapper) QueryShipByVictim(ctx context.Context, filters AnalyticsFil
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsFilters, limit int) ([]ShipAggregationByAttackerShip, error) {
|
||||
func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByAttackerShip, error) {
|
||||
flog := logger.Default.WithPrefix("QueryShipByAttacker")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
whereClause, whereArgs := buildAttackerWhereClause(filters)
|
||||
@@ -351,8 +349,7 @@ func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsF
|
||||
%s
|
||||
GROUP BY ship_type_name, ship_group_name
|
||||
ORDER BY kills_participated DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, whereClause, limit)
|
||||
`, killmailSubquery, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -373,7 +370,7 @@ func (db *DBWrapper) QueryShipByAttacker(ctx context.Context, filters AnalyticsF
|
||||
}
|
||||
|
||||
// Player aggregation queries
|
||||
func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimCharacter, error) {
|
||||
func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCharacter, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByVictimCharacter")
|
||||
whereClause, args := buildWhereClause(filters)
|
||||
|
||||
@@ -388,8 +385,7 @@ func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters A
|
||||
%s
|
||||
GROUP BY victim_character_name, victim_corporation_name, victim_alliance_name
|
||||
ORDER BY deaths DESC
|
||||
LIMIT %d
|
||||
`, whereClause, limit)
|
||||
`, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -409,7 +405,7 @@ func (db *DBWrapper) QueryPlayerByVictimCharacter(ctx context.Context, filters A
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimCorporation, error) {
|
||||
func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCorporation, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByVictimCorporation")
|
||||
whereClause, args := buildWhereClause(filters)
|
||||
|
||||
@@ -423,8 +419,7 @@ func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters
|
||||
%s
|
||||
GROUP BY victim_corporation_name, victim_alliance_name
|
||||
ORDER BY losses DESC
|
||||
LIMIT %d
|
||||
`, whereClause, limit)
|
||||
`, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -444,7 +439,7 @@ func (db *DBWrapper) QueryPlayerByVictimCorporation(ctx context.Context, filters
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimAlliance, error) {
|
||||
func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimAlliance, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByVictimAlliance")
|
||||
whereClause, args := buildWhereClause(filters)
|
||||
|
||||
@@ -465,8 +460,7 @@ func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters An
|
||||
%s
|
||||
GROUP BY victim_alliance_name
|
||||
ORDER BY losses DESC
|
||||
LIMIT %d
|
||||
`, whereWithAlliance, limit)
|
||||
`, whereWithAlliance)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -486,7 +480,7 @@ func (db *DBWrapper) QueryPlayerByVictimAlliance(ctx context.Context, filters An
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerCharacter, error) {
|
||||
func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCharacter, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByAttackerCharacter")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
whereClause, whereArgs := buildAttackerWhereClause(filters)
|
||||
@@ -505,8 +499,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters
|
||||
%s
|
||||
GROUP BY character_name, corporation_name, alliance_name
|
||||
ORDER BY kills_participated DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, whereClause, limit)
|
||||
`, killmailSubquery, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -526,7 +519,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCharacter(ctx context.Context, filters
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerCorporation, error) {
|
||||
func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCorporation, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByAttackerCorporation")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
whereClause, whereArgs := buildAttackerWhereClause(filters)
|
||||
@@ -543,8 +536,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filte
|
||||
%s
|
||||
GROUP BY corporation_name, alliance_name
|
||||
ORDER BY kills_participated DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, whereClause, limit)
|
||||
`, killmailSubquery, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -564,7 +556,7 @@ func (db *DBWrapper) QueryPlayerByAttackerCorporation(ctx context.Context, filte
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerAlliance, error) {
|
||||
func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerAlliance, error) {
|
||||
flog := logger.Default.WithPrefix("QueryPlayerByAttackerAlliance")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
whereClause, whereArgs := buildAttackerWhereClause(filters)
|
||||
@@ -581,8 +573,7 @@ func (db *DBWrapper) QueryPlayerByAttackerAlliance(ctx context.Context, filters
|
||||
%s AND alliance_name != ''
|
||||
GROUP BY alliance_name
|
||||
ORDER BY kills_participated DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, whereClause, limit)
|
||||
`, killmailSubquery, whereClause)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -652,7 +643,7 @@ func (db *DBWrapper) QueryModuleBySlotType(ctx context.Context, filters Analytic
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsFilters, limit int) ([]ModuleAggregationByModule, error) {
|
||||
func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsFilters) ([]ModuleAggregationByModule, error) {
|
||||
flog := logger.Default.WithPrefix("QueryModuleByModule")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
|
||||
@@ -682,8 +673,7 @@ func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsF
|
||||
%s
|
||||
GROUP BY item_type_name, item_group_name, item_category_name
|
||||
ORDER BY times_fitted DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, slotTypeFilter, limit)
|
||||
`, killmailSubquery, slotTypeFilter)
|
||||
|
||||
flog.Debug("Executing query: %s", query)
|
||||
rows, err := db.ch.Query(ctx, query, args...)
|
||||
@@ -703,7 +693,7 @@ func (db *DBWrapper) QueryModuleByModule(ctx context.Context, filters AnalyticsF
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters AnalyticsFilters, selectedModule, selectedSlot string, limit int) ([]ModuleCoOccurrence, error) {
|
||||
func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters AnalyticsFilters, selectedModule, selectedSlot string) ([]ModuleCoOccurrence, error) {
|
||||
flog := logger.Default.WithPrefix("QueryModuleCoOccurrence")
|
||||
killmailSubquery, killmailArgs := getKillmailIDSubquery(filters)
|
||||
|
||||
@@ -726,8 +716,7 @@ func (db *DBWrapper) QueryModuleCoOccurrence(ctx context.Context, filters Analyt
|
||||
AND NOT (item_type_name = ? AND slot_type = ?)
|
||||
GROUP BY item_type_name, slot_type
|
||||
ORDER BY times_fitted_together DESC
|
||||
LIMIT %d
|
||||
`, killmailSubquery, limit)
|
||||
`, killmailSubquery)
|
||||
|
||||
args = append(args, selectedModule, selectedSlot)
|
||||
flog.Debug("Executing query: %s", query)
|
||||
|
||||
@@ -126,7 +126,7 @@ func TestQueryLocationBySystem(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryLocationBySystem(ctx, filters, 10)
|
||||
results, err := db.QueryLocationBySystem(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryLocationBySystem failed: %v", err)
|
||||
}
|
||||
@@ -235,7 +235,7 @@ func TestQueryShipByVictim(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryShipByVictim(ctx, filters, 10)
|
||||
results, err := db.QueryShipByVictim(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryShipByVictim failed: %v", err)
|
||||
}
|
||||
@@ -263,7 +263,7 @@ func TestQueryShipByAttacker(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryShipByAttacker(ctx, filters, 10)
|
||||
results, err := db.QueryShipByAttacker(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryShipByAttacker failed: %v", err)
|
||||
}
|
||||
@@ -291,7 +291,7 @@ func TestQueryPlayerByVictimCharacter(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByVictimCharacter(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByVictimCharacter(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByVictimCharacter failed: %v", err)
|
||||
}
|
||||
@@ -319,7 +319,7 @@ func TestQueryPlayerByVictimCorporation(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByVictimCorporation(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByVictimCorporation(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByVictimCorporation failed: %v", err)
|
||||
}
|
||||
@@ -347,7 +347,7 @@ func TestQueryPlayerByVictimAlliance(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByVictimAlliance(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByVictimAlliance(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByVictimAlliance failed: %v", err)
|
||||
}
|
||||
@@ -375,7 +375,7 @@ func TestQueryPlayerByAttackerCharacter(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByAttackerCharacter(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByAttackerCharacter(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByAttackerCharacter failed: %v", err)
|
||||
}
|
||||
@@ -403,7 +403,7 @@ func TestQueryPlayerByAttackerCorporation(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByAttackerCorporation(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByAttackerCorporation(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByAttackerCorporation failed: %v", err)
|
||||
}
|
||||
@@ -431,7 +431,7 @@ func TestQueryPlayerByAttackerAlliance(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryPlayerByAttackerAlliance(ctx, filters, 10)
|
||||
results, err := db.QueryPlayerByAttackerAlliance(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryPlayerByAttackerAlliance failed: %v", err)
|
||||
}
|
||||
@@ -484,7 +484,7 @@ func TestQueryModuleByModule(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryModuleByModule(ctx, filters, 10)
|
||||
results, err := db.QueryModuleByModule(ctx, filters)
|
||||
if err != nil {
|
||||
t.Fatalf("QueryModuleByModule failed: %v", err)
|
||||
}
|
||||
@@ -512,7 +512,7 @@ func TestQueryModuleCoOccurrence(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
filters := AnalyticsFilters{}
|
||||
|
||||
results, err := db.QueryModuleCoOccurrence(ctx, filters, "Stasis Webifier II", "mid", 10)
|
||||
results, err := db.QueryModuleCoOccurrence(ctx, filters, "Stasis Webifier II", "mid")
|
||||
if err != nil {
|
||||
t.Fatalf("QueryModuleCoOccurrence failed: %v", err)
|
||||
}
|
||||
|
||||
73
api.go
73
api.go
@@ -23,14 +23,12 @@ type APIStatisticsRequest struct {
|
||||
|
||||
type APIAnalyticsRequest struct {
|
||||
Filters AnalyticsFilters `json:"filters"`
|
||||
Limit *int `json:"limit,omitempty"`
|
||||
}
|
||||
|
||||
type APIModuleCoOccurrenceRequest struct {
|
||||
Filters AnalyticsFilters `json:"filters"`
|
||||
SelectedModule string `json:"selectedModule"`
|
||||
SelectedSlot string `json:"selectedSlot"`
|
||||
Limit *int `json:"limit,omitempty"`
|
||||
SelectedModule string `json:"selectedModule"`
|
||||
SelectedSlot string `json:"selectedSlot"`
|
||||
}
|
||||
|
||||
type APISearchResult struct {
|
||||
@@ -132,11 +130,7 @@ func handleAnalyticsTimeByMonth(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
func handleAnalyticsLocationBySystem(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryLocationBySystem(r.Context(), req.Filters, limit)
|
||||
return db.QueryLocationBySystem(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -160,81 +154,49 @@ func handleAnalyticsLocationBySecurity(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
func handleAnalyticsShipByVictim(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryShipByVictim(r.Context(), req.Filters, limit)
|
||||
return db.QueryShipByVictim(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsShipByAttacker(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryShipByAttacker(r.Context(), req.Filters, limit)
|
||||
return db.QueryShipByAttacker(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByVictimCharacter(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByVictimCharacter(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByVictimCharacter(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByVictimCorporation(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByVictimCorporation(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByVictimCorporation(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByVictimAlliance(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByVictimAlliance(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByVictimAlliance(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByAttackerCharacter(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByAttackerCharacter(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByAttackerCharacter(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByAttackerCorporation(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByAttackerCorporation(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByAttackerCorporation(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
func handleAnalyticsPlayerByAttackerAlliance(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryPlayerByAttackerAlliance(r.Context(), req.Filters, limit)
|
||||
return db.QueryPlayerByAttackerAlliance(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -246,11 +208,7 @@ func handleAnalyticsModuleBySlotType(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
func handleAnalyticsModuleByModule(w http.ResponseWriter, r *http.Request) {
|
||||
handleAnalyticsQuery(w, r, func(db DB, req APIAnalyticsRequest) (interface{}, error) {
|
||||
limit := 100
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
return db.QueryModuleByModule(r.Context(), req.Filters, limit)
|
||||
return db.QueryModuleByModule(r.Context(), req.Filters)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -276,12 +234,7 @@ func handleAnalyticsModuleCoOccurrence(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
limit := 50
|
||||
if req.Limit != nil && *req.Limit > 0 {
|
||||
limit = *req.Limit
|
||||
}
|
||||
|
||||
results, err := db.QueryModuleCoOccurrence(r.Context(), req.Filters, req.SelectedModule, req.SelectedSlot, limit)
|
||||
results, err := db.QueryModuleCoOccurrence(r.Context(), req.Filters, req.SelectedModule, req.SelectedSlot)
|
||||
if err != nil {
|
||||
flog.Error("Query failed: %v", err)
|
||||
http.Error(w, "Internal server error", http.StatusInternalServerError)
|
||||
|
||||
62
db.go
62
db.go
@@ -3,7 +3,6 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -50,21 +49,21 @@ type DB interface {
|
||||
QueryTimeByDay(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByDay, error)
|
||||
QueryTimeByDate(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByDate, error)
|
||||
QueryTimeByMonth(ctx context.Context, filters AnalyticsFilters) ([]TimeAggregationByMonth, error)
|
||||
QueryLocationBySystem(ctx context.Context, filters AnalyticsFilters, limit int) ([]LocationAggregationBySystem, error)
|
||||
QueryLocationBySystem(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationBySystem, error)
|
||||
QueryLocationByRegion(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationByRegion, error)
|
||||
QueryLocationByConstellation(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationByConstellation, error)
|
||||
QueryLocationBySecurity(ctx context.Context, filters AnalyticsFilters) ([]LocationAggregationBySecurity, error)
|
||||
QueryShipByVictim(ctx context.Context, filters AnalyticsFilters, limit int) ([]ShipAggregationByVictimShip, error)
|
||||
QueryShipByAttacker(ctx context.Context, filters AnalyticsFilters, limit int) ([]ShipAggregationByAttackerShip, error)
|
||||
QueryPlayerByVictimCharacter(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimCharacter, error)
|
||||
QueryPlayerByVictimCorporation(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimCorporation, error)
|
||||
QueryPlayerByVictimAlliance(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByVictimAlliance, error)
|
||||
QueryPlayerByAttackerCharacter(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerCharacter, error)
|
||||
QueryPlayerByAttackerCorporation(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerCorporation, error)
|
||||
QueryPlayerByAttackerAlliance(ctx context.Context, filters AnalyticsFilters, limit int) ([]PlayerAggregationByAttackerAlliance, error)
|
||||
QueryShipByVictim(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByVictimShip, error)
|
||||
QueryShipByAttacker(ctx context.Context, filters AnalyticsFilters) ([]ShipAggregationByAttackerShip, error)
|
||||
QueryPlayerByVictimCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCharacter, error)
|
||||
QueryPlayerByVictimCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimCorporation, error)
|
||||
QueryPlayerByVictimAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByVictimAlliance, error)
|
||||
QueryPlayerByAttackerCharacter(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCharacter, error)
|
||||
QueryPlayerByAttackerCorporation(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerCorporation, error)
|
||||
QueryPlayerByAttackerAlliance(ctx context.Context, filters AnalyticsFilters) ([]PlayerAggregationByAttackerAlliance, error)
|
||||
QueryModuleBySlotType(ctx context.Context, filters AnalyticsFilters) ([]ModuleAggregationBySlotType, error)
|
||||
QueryModuleByModule(ctx context.Context, filters AnalyticsFilters, limit int) ([]ModuleAggregationByModule, error)
|
||||
QueryModuleCoOccurrence(ctx context.Context, filters AnalyticsFilters, selectedModule, selectedSlot string, limit int) ([]ModuleCoOccurrence, error)
|
||||
QueryModuleByModule(ctx context.Context, filters AnalyticsFilters) ([]ModuleAggregationByModule, error)
|
||||
QueryModuleCoOccurrence(ctx context.Context, filters AnalyticsFilters, selectedModule, selectedSlot string) ([]ModuleCoOccurrence, error)
|
||||
}
|
||||
|
||||
type DBWrapper struct {
|
||||
@@ -614,45 +613,6 @@ func (db *DBWrapper) GetModuleSlots(moduleIDs []int64) (map[int64]ModuleSlot, er
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func limitKillmails(killmailIDs []int64, limit int) []int64 {
|
||||
if limit <= 0 || len(killmailIDs) <= limit {
|
||||
return killmailIDs
|
||||
}
|
||||
return killmailIDs[:limit]
|
||||
}
|
||||
|
||||
// parseKeyValuePairs parses a string like "123:456,789:012" into key-value pairs
|
||||
func parseKeyValuePairs(data string, callback func(key, value int64)) {
|
||||
if data == "" {
|
||||
return
|
||||
}
|
||||
|
||||
pairs := strings.Split(data, ",")
|
||||
for _, pair := range pairs {
|
||||
if kv := strings.Split(pair, ":"); len(kv) == 2 {
|
||||
if key, err := strconv.ParseInt(kv[0], 10, 64); err == nil {
|
||||
if value, err := strconv.ParseInt(kv[1], 10, 64); err == nil {
|
||||
callback(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// parseKillmailIDs parses a string like "123,456,789" into a slice of int64
|
||||
func parseKillmailIDs(data string, result *[]int64) {
|
||||
if data == "" {
|
||||
return
|
||||
}
|
||||
|
||||
ids := strings.Split(data, ",")
|
||||
for _, idStr := range ids {
|
||||
if id, err := strconv.ParseInt(idStr, 10, 64); err == nil {
|
||||
*result = append(*result, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// HasModules returns true if the query has module filters
|
||||
func (qp QueryParams) HasModules() bool {
|
||||
return len(qp.Modules) > 0
|
||||
|
||||
Reference in New Issue
Block a user