Skip to content

Commit 707279d

Browse files
committed
Fix boolean handling under Postgres
The change in cce5bf9 fixed booleans on older SQLite versions, but broke the queries for Postgres. This is a workaround that should make both databases happy. Since Postgres is extra pedantic in CASE epxressions, the complex order position queries had to be moved to the set of dialect-specific queries.
1 parent 0f07d21 commit 707279d

File tree

9 files changed

+97
-54
lines changed

9 files changed

+97
-54
lines changed

libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa
10431043
true
10441044
}
10451045

1046-
val positions = db.orderPositionQueries.search(
1046+
val positions = db.compatQueries.searchOrderPosition(
10471047
queryStartsWith = "$query%",
10481048
queryContains = "%$query%",
10491049
use_event_filter = useEventFilter,
@@ -1163,7 +1163,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa
11631163
}
11641164

11651165
for (`var` in product.variations) {
1166-
val position_count = db.orderPositionQueries.countForStatus(
1166+
val position_count = db.compatQueries.countOrderPositionForStatus(
11671167
event_slug = list.eventSlug,
11681168
include_pending = list.includePending,
11691169
subevent_id = subEventId,
@@ -1174,7 +1174,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa
11741174
variation_id = `var`.server_id,
11751175
).executeAsOne().toInt()
11761176

1177-
val ci_count = db.orderPositionQueries.countForStatus(
1177+
val ci_count = db.compatQueries.countOrderPositionForStatus(
11781178
event_slug = list.eventSlug,
11791179
include_pending = list.includePending,
11801180
subevent_id = subEventId,
@@ -1193,7 +1193,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa
11931193
))
11941194
}
11951195

1196-
val position_count = db.orderPositionQueries.countForStatus(
1196+
val position_count = db.compatQueries.countOrderPositionForStatus(
11971197
event_slug = list.eventSlug,
11981198
include_pending = list.includePending,
11991199
subevent_id = subEventId,
@@ -1204,7 +1204,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val db: SyncDa
12041204
variation_id = -1L,
12051205
).executeAsOne().toInt()
12061206

1207-
val ci_count = db.orderPositionQueries.countForStatus(
1207+
val ci_count = db.compatQueries.countOrderPositionForStatus(
12081208
event_slug = list.eventSlug,
12091209
include_pending = list.includePending,
12101210
subevent_id = subEventId,

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/BadgeLayout.sq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ selectDefaultForEventSlug:
2626
SELECT *
2727
FROM BadgeLayout
2828
WHERE
29-
is_default = 1
29+
CAST(is_default AS INTEGER) = 1
3030
AND event_slug = ?;
3131

3232
insert:

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/BlockedTicketSecret.sq

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ WHERE event_slug = ?;
1616
countBlockedForSecret:
1717
SELECT COUNT(*)
1818
FROM BlockedTicketSecret
19-
WHERE blocked = 1 AND secret = ?;
19+
WHERE CAST(blocked AS INTEGER) = 1 AND secret = ?;
2020

2121
deleteByServerId:
2222
DELETE FROM BlockedTicketSecret
2323
WHERE server_id = ?;
2424

2525
deleteNotBlocked:
2626
DELETE FROM BlockedTicketSecret
27-
WHERE blocked = 0;
27+
WHERE CAST(blocked AS INTEGER) = 0;
2828

2929
insert:
3030
INSERT INTO BlockedTicketSecret(

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/Closing.sq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ selectClosedWithoutServerId:
1212
SELECT *
1313
FROM Closing
1414
WHERE
15-
open = 0
15+
CAST(open AS INTEGER) = 0
1616
AND server_id IS NULL;
1717

1818
insert:

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/OrderPosition.sq

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -80,46 +80,3 @@ SET
8080
subevent_id = ?,
8181
variation_id = ?
8282
WHERE id = ?;
83-
84-
search:
85-
SELECT OrderPosition.*
86-
FROM OrderPosition
87-
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
88-
LEFT JOIN Item ON OrderPosition.item = Item.id
89-
WHERE (
90-
UPPER(OrderPosition.secret) LIKE :queryStartsWith
91-
OR UPPER(OrderPosition.attendee_name) LIKE :queryContains
92-
OR UPPER(OrderPosition.attendee_email) LIKE :queryContains
93-
OR UPPER(orders.email) LIKE :queryContains
94-
OR UPPER(orders.code) LIKE :queryStartsWith
95-
)
96-
AND (
97-
CASE WHEN (:use_event_filter) THEN (orders.event_slug IN :event_filter) ELSE 0 END
98-
OR CASE WHEN (:use_event_item_filter) THEN (orders.event_slug IN :event_item_filter_events AND OrderPosition.item IN :event_item_filter_items) ELSE 0 END
99-
OR CASE WHEN (:use_event_subevent_filter) THEN (orders.event_slug IN :event_subevent_filter_events AND OrderPosition.subevent_id IN :event_subevent_filter_subevents) ELSE 0 END
100-
OR CASE WHEN (:use_all_filter) THEN (orders.event_slug IN :all_filter_events AND OrderPosition.item IN :all_filter_items AND OrderPosition.subevent_id IN :all_filter_subevents) ELSE 0 END
101-
)
102-
LIMIT :limit
103-
OFFSET :offset;
104-
105-
countForStatus:
106-
-- TODO: Check if DISTINCT is required here
107-
SELECT COUNT(DISTINCT OrderPosition.id)
108-
FROM OrderPosition
109-
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
110-
WHERE(
111-
orders.event_slug = :event_slug
112-
AND CASE WHEN (:include_pending)
113-
THEN orders.status IN ('p', 'n')
114-
ELSE (orders.status = 'p' OR (orders.status = 'n' AND orders.valid_if_pending = 1))
115-
END
116-
AND CASE WHEN (:subevent_id > 0) THEN OrderPosition.subevent_id = :subevent_id ELSE 1 END
117-
AND CASE WHEN (:not_all_items) THEN OrderPosition.item IN :list_item_ids ELSE 1 END
118-
AND CASE WHEN (:only_checked_in_list_server_id > 0) THEN
119-
(OrderPosition.id IN (SELECT position FROM CheckIn WHERE listId = :only_checked_in_list_server_id AND type = 'entry'))
120-
ELSE
121-
1
122-
END
123-
AND OrderPosition.item = :item_id
124-
AND CASE WHEN (:variation_id > 0) THEN OrderPosition.variation_id = :variation_id ELSE 1 END
125-
);

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/QueuedOrder.sq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ WHERE id = ?;
66
selectUnlockedWithoutError:
77
SELECT *
88
FROM QueuedOrder
9-
WHERE locked = 0 AND error IS NULL;
9+
WHERE CAST(locked AS INTEGER) = 0 AND error IS NULL;
1010

1111
delete:
1212
DELETE FROM QueuedOrder

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/TicketLayout.sq

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ selectDefaultForEventSlug:
1717
SELECT *
1818
FROM TicketLayout
1919
WHERE
20-
is_default = 1
20+
CAST(is_default AS INTEGER) = 1
2121
AND event_slug = ?;
2222

2323
deleteByServerId:

libpretixsync/src/main/sqldelight/postgres/eu/pretix/libpretixsync/sqldelight/compat.sq

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,46 @@ TRUNCATE
7474
SubEvent,
7575
TaxRule,
7676
TicketLayout;
77+
78+
searchOrderPosition:
79+
SELECT OrderPosition.*
80+
FROM OrderPosition
81+
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
82+
LEFT JOIN Item ON OrderPosition.item = Item.id
83+
WHERE (
84+
UPPER(OrderPosition.secret) LIKE :queryStartsWith
85+
OR UPPER(OrderPosition.attendee_name) LIKE :queryContains
86+
OR UPPER(OrderPosition.attendee_email) LIKE :queryContains
87+
OR UPPER(orders.email) LIKE :queryContains
88+
OR UPPER(orders.code) LIKE :queryStartsWith
89+
)
90+
AND (
91+
CASE WHEN (:use_event_filter) THEN (orders.event_slug IN :event_filter) ELSE FALSE END
92+
OR CASE WHEN (:use_event_item_filter) THEN (orders.event_slug IN :event_item_filter_events AND OrderPosition.item IN :event_item_filter_items) ELSE FALSE END
93+
OR CASE WHEN (:use_event_subevent_filter) THEN (orders.event_slug IN :event_subevent_filter_events AND OrderPosition.subevent_id IN :event_subevent_filter_subevents) ELSE FALSE END
94+
OR CASE WHEN (:use_all_filter) THEN (orders.event_slug IN :all_filter_events AND OrderPosition.item IN :all_filter_items AND OrderPosition.subevent_id IN :all_filter_subevents) ELSE FALSE END
95+
)
96+
LIMIT :limit
97+
OFFSET :offset;
98+
99+
countOrderPositionForStatus:
100+
-- TODO: Check if DISTINCT is required here
101+
SELECT COUNT(DISTINCT OrderPosition.id)
102+
FROM OrderPosition
103+
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
104+
WHERE(
105+
orders.event_slug = :event_slug
106+
AND CASE WHEN (:include_pending)
107+
THEN orders.status IN ('p', 'n')
108+
ELSE (orders.status = 'p' OR (orders.status = 'n' AND orders.valid_if_pending = TRUE))
109+
END
110+
AND CASE WHEN (:subevent_id > 0) THEN OrderPosition.subevent_id = :subevent_id ELSE TRUE END
111+
AND CASE WHEN (:not_all_items) THEN OrderPosition.item IN :list_item_ids ELSE TRUE END
112+
AND CASE WHEN (:only_checked_in_list_server_id > 0) THEN
113+
(OrderPosition.id IN (SELECT position FROM CheckIn WHERE listId = :only_checked_in_list_server_id AND type = 'entry'))
114+
ELSE
115+
TRUE
116+
END
117+
AND OrderPosition.item = :item_id
118+
AND CASE WHEN (:variation_id > 0) THEN OrderPosition.variation_id = :variation_id ELSE TRUE END
119+
);

libpretixsync/src/main/sqldelight/sqlite/eu/pretix/libpretixsync/sqldelight/compat.sq

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,46 @@ truncateAllTables {
7474
DELETE FROM TaxRule;
7575
DELETE FROM TicketLayout;
7676
}
77+
78+
searchOrderPosition:
79+
SELECT OrderPosition.*
80+
FROM OrderPosition
81+
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
82+
LEFT JOIN Item ON OrderPosition.item = Item.id
83+
WHERE (
84+
UPPER(OrderPosition.secret) LIKE :queryStartsWith
85+
OR UPPER(OrderPosition.attendee_name) LIKE :queryContains
86+
OR UPPER(OrderPosition.attendee_email) LIKE :queryContains
87+
OR UPPER(orders.email) LIKE :queryContains
88+
OR UPPER(orders.code) LIKE :queryStartsWith
89+
)
90+
AND (
91+
CASE WHEN (:use_event_filter) THEN (orders.event_slug IN :event_filter) ELSE 0 END
92+
OR CASE WHEN (:use_event_item_filter) THEN (orders.event_slug IN :event_item_filter_events AND OrderPosition.item IN :event_item_filter_items) ELSE 0 END
93+
OR CASE WHEN (:use_event_subevent_filter) THEN (orders.event_slug IN :event_subevent_filter_events AND OrderPosition.subevent_id IN :event_subevent_filter_subevents) ELSE 0 END
94+
OR CASE WHEN (:use_all_filter) THEN (orders.event_slug IN :all_filter_events AND OrderPosition.item IN :all_filter_items AND OrderPosition.subevent_id IN :all_filter_subevents) ELSE 0 END
95+
)
96+
LIMIT :limit
97+
OFFSET :offset;
98+
99+
countOrderPositionForStatus:
100+
-- TODO: Check if DISTINCT is required here
101+
SELECT COUNT(DISTINCT OrderPosition.id)
102+
FROM OrderPosition
103+
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
104+
WHERE(
105+
orders.event_slug = :event_slug
106+
AND CASE WHEN (:include_pending)
107+
THEN orders.status IN ('p', 'n')
108+
ELSE (orders.status = 'p' OR (orders.status = 'n' AND orders.valid_if_pending = 1))
109+
END
110+
AND CASE WHEN (:subevent_id > 0) THEN OrderPosition.subevent_id = :subevent_id ELSE 1 END
111+
AND CASE WHEN (:not_all_items) THEN OrderPosition.item IN :list_item_ids ELSE 1 END
112+
AND CASE WHEN (:only_checked_in_list_server_id > 0) THEN
113+
(OrderPosition.id IN (SELECT position FROM CheckIn WHERE listId = :only_checked_in_list_server_id AND type = 'entry'))
114+
ELSE
115+
1
116+
END
117+
AND OrderPosition.item = :item_id
118+
AND CASE WHEN (:variation_id > 0) THEN OrderPosition.variation_id = :variation_id ELSE 1 END
119+
);

0 commit comments

Comments
 (0)