Remove limits that nobody ever asked for

This commit is contained in:
2026-01-24 23:13:05 +01:00
parent e87f476b43
commit ae02ded7e6
4 changed files with 57 additions and 155 deletions

View File

@@ -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)

View File

@@ -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
View File

@@ -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
View File

@@ -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