diff --git a/handlers.go b/handlers.go index f745024..25e1ccf 100644 --- a/handlers.go +++ b/handlers.go @@ -226,8 +226,6 @@ func (s *Server) handleWebsocket(w http.ResponseWriter, r *http.Request) { advancedQuerier.BeforeQuery(filter) } - // TODO: Program calls SQL once for each filter in filters array. - // Maybe can replace with a single SQL query? events, err := store.QueryEvents(filter) if err != nil { s.Log.Errorf("store: %v", err) diff --git a/storage/postgresql/init.go b/storage/postgresql/init.go index 295d625..15f03f7 100644 --- a/storage/postgresql/init.go +++ b/storage/postgresql/init.go @@ -39,7 +39,7 @@ CREATE TABLE IF NOT EXISTS event ( CREATE UNIQUE INDEX IF NOT EXISTS ididx ON event USING btree (id text_pattern_ops); CREATE INDEX IF NOT EXISTS pubkeyprefix ON event USING btree (pubkey text_pattern_ops); -CREATE INDEX IF NOT EXISTS timeidx ON event (created_at); +CREATE INDEX IF NOT EXISTS timeidx ON event (created_at DESC); CREATE INDEX IF NOT EXISTS kindidx ON event (kind); CREATE INDEX IF NOT EXISTS arbitrarytagvalues ON event USING gin (tagvalues); `) diff --git a/storage/postgresql/query.go b/storage/postgresql/query.go index 782f3c7..7c250ed 100644 --- a/storage/postgresql/query.go +++ b/storage/postgresql/query.go @@ -128,11 +128,17 @@ func (b PostgresBackend) QueryEvents(filter *nostr.Filter) (events []nostr.Event conditions = append(conditions, "true") } + if filter.Limit < 1 || filter.Limit > 100 { + params = append(params, 100) + } else { + params = append(params, filter.Limit) + } + query := b.DB.Rebind(`SELECT id, pubkey, created_at, kind, tags, content, sig FROM event WHERE ` + strings.Join(conditions, " AND ") + - " ORDER BY created_at LIMIT 100") + " ORDER BY created_at DESC LIMIT ?") rows, err := b.DB.Query(query, params...) if err != nil && err != sql.ErrNoRows {