|
1 | | -use std::ops::Deref; |
2 | 1 | use crate::db::QueryResult; |
| 2 | +use crate::error; |
3 | 3 | use crate::error::Result; |
4 | 4 | use crate::event::{single_char_tagname, Event}; |
5 | 5 | use crate::nip05::{Nip05Name, VerificationRecord}; |
6 | 6 | use crate::payment::{InvoiceInfo, InvoiceStatus}; |
| 7 | +use crate::repo::postgres_migration::run_migrations; |
7 | 8 | use crate::repo::{now_jitter, NostrRepo}; |
| 9 | +use crate::server::NostrMetrics; |
8 | 10 | use crate::subscription::{ReqFilter, Subscription, TagOperand}; |
| 11 | +use crate::utils::{self, is_hex, is_lower_hex}; |
9 | 12 | use async_std::stream::StreamExt; |
10 | 13 | use async_trait::async_trait; |
11 | 14 | use chrono::{DateTime, TimeZone, Utc}; |
| 15 | +use itertools::Itertools; |
| 16 | +use nostr::key::Keys; |
12 | 17 | use sqlx::postgres::PgRow; |
13 | 18 | use sqlx::Error::RowNotFound; |
14 | 19 | use sqlx::{Error, Execute, FromRow, Postgres, QueryBuilder, Row}; |
| 20 | +use std::ops::Deref; |
15 | 21 | use std::time::{Duration, Instant}; |
16 | | -use itertools::Itertools; |
17 | | -use crate::error; |
18 | | -use crate::repo::postgres_migration::run_migrations; |
19 | | -use crate::server::NostrMetrics; |
20 | | -use crate::utils::{self, is_hex, is_lower_hex}; |
21 | | -use nostr::key::Keys; |
22 | 22 | use tokio::sync::mpsc::Sender; |
23 | 23 | use tokio::sync::oneshot::Receiver; |
24 | 24 | use tracing::{debug, error, info, trace, warn}; |
@@ -765,7 +765,9 @@ fn query_from_filter(f: &'_ ReqFilter) -> Option<QueryBuilder<'_, Postgres>> { |
765 | 765 | tag_ctr += 1; |
766 | 766 | query.push("))"); |
767 | 767 | } else if let TagOperand::And(v_and) = val { |
768 | | - for vx in v_and.iter() { |
| 768 | + let mut sorted_values: Vec<_> = v_and.iter().collect(); |
| 769 | + sorted_values.sort(); |
| 770 | + for vx in sorted_values { |
769 | 771 | query |
770 | 772 | .push(format!( |
771 | 773 | " JOIN \"tag\" t{0} on e.id = t{0}.event_id AND t{0}.\"name\" = ", |
|
0 commit comments