Skip to content

Commit b7907ea

Browse files
committed
Migrate AsyncCheckProvider.status()
1 parent a4f581b commit b7907ea

File tree

2 files changed

+83
-56
lines changed

2 files changed

+83
-56
lines changed

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

+61-56
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ import eu.pretix.libpretixsync.crypto.readPubkeyFromPem
99
import eu.pretix.libpretixsync.crypto.sig1.TicketProtos
1010
import eu.pretix.libpretixsync.db.Answer
1111
import eu.pretix.libpretixsync.db.NonceGenerator
12-
import eu.pretix.libpretixsync.db.Order
13-
import eu.pretix.libpretixsync.db.OrderPosition
1412
import eu.pretix.libpretixsync.db.QuestionLike
1513
import eu.pretix.libpretixsync.db.QueuedCall
1614
import eu.pretix.libpretixsync.db.QueuedCheckIn
1715
import eu.pretix.libpretixsync.models.CheckIn
18-
import eu.pretix.libpretixsync.models.CheckInList
1916
import eu.pretix.libpretixsync.models.Event
2017
import eu.pretix.libpretixsync.models.Order as OrderModel
2118
import eu.pretix.libpretixsync.models.OrderPosition as OrderPositionModel
@@ -29,7 +26,6 @@ import eu.pretix.libpretixsync.utils.logic.JsonLogic
2926
import eu.pretix.libpretixsync.utils.logic.truthy
3027
import io.requery.BlockingEntityStore
3128
import io.requery.Persistable
32-
import io.requery.kotlin.Logical
3329
import io.requery.query.*
3430
import org.joda.time.DateTime
3531
import org.joda.time.DateTimeZone
@@ -1129,48 +1125,6 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
11291125
return results
11301126
}
11311127

1132-
private fun basePositionQuery(lists: List<CheckInList>, onlyCheckedIn: Boolean): WhereAndOr<out Scalar<Int?>?> {
1133-
1134-
var q = dataStore.count(OrderPosition::class.java).distinct()
1135-
.leftJoin(Order::class.java).on(OrderPosition.ORDER_ID.eq(Order.ID))
1136-
.where(OrderPosition.SERVER_ID.eq(-1)) // stupid logic node just so we can dynamically add .or() below
1137-
1138-
for (list in lists) {
1139-
var lq: Logical<*, *> = Order.EVENT_SLUG.eq(list.eventSlug)
1140-
if (list.includePending) {
1141-
lq = lq.and(Order.STATUS.`in`(listOf("p", "n")))
1142-
} else {
1143-
lq = lq.and(Order.STATUS.eq("p").or(Order.STATUS.eq("n").and(Order.VALID_IF_PENDING.eq(true))))
1144-
}
1145-
1146-
if (list.subEventId != null && list.subEventId > 0) {
1147-
lq = lq.and(OrderPosition.SUBEVENT_ID.eq(list.subEventId))
1148-
}
1149-
1150-
if (!list.allItems) {
1151-
val product_ids = db.checkInListQueries.selectItemIdsForList(list.id)
1152-
.executeAsList()
1153-
.map {
1154-
// Not-null assertion needed for SQLite
1155-
it.id!!
1156-
}
1157-
lq = lq.and(OrderPosition.ITEM_ID.`in`(product_ids))
1158-
}
1159-
1160-
if (onlyCheckedIn) {
1161-
lq = lq.and(OrderPosition.ID.`in`(
1162-
db.checkInQueries.selectPositionIdByListIdAndType(
1163-
list_server_id = list.serverId,
1164-
type = "entry"
1165-
).executeAsList().map { it.position }
1166-
))
1167-
}
1168-
q = q.or(lq)
1169-
}
1170-
1171-
return q
1172-
}
1173-
11741128
@Throws(CheckException::class)
11751129
override fun status(eventSlug: String, listId: Long): TicketCheckProvider.StatusResult {
11761130
sentry.addBreadcrumb("provider.status", "offline status started")
@@ -1195,24 +1149,75 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
11951149
for (product in products) {
11961150
val variations: MutableList<TicketCheckProvider.StatusResultItemVariation> = ArrayList()
11971151
try {
1152+
val subEventId = if (list.subEventId != null && list.subEventId > 0) list.subEventId else -1L
1153+
1154+
val notAllItems = !list.allItems
1155+
val listItemIds = if (notAllItems) {
1156+
db.checkInListQueries.selectItemIdsForList(list.id)
1157+
.executeAsList()
1158+
.map {
1159+
// Not-null assertion needed for SQLite
1160+
it.id!!
1161+
}
1162+
} else {
1163+
// Dummy ID that is not used. Required for SQLDelight to generate valid SQL.
1164+
// See comments in search().
1165+
listOf(-1L)
1166+
}
1167+
11981168
for (`var` in product.variations) {
1199-
val position_count = basePositionQuery(listOf(list), false)
1200-
.and(OrderPosition.ITEM_ID.eq(product.id))
1201-
.and(OrderPosition.VARIATION_ID.eq(`var`.server_id)).get()!!.value()!!
1202-
val ci_count = basePositionQuery(listOf(list), true)
1203-
.and(OrderPosition.ITEM_ID.eq(product.id))
1204-
.and(OrderPosition.VARIATION_ID.eq(`var`.server_id)).get()!!.value()!!
1169+
val position_count = db.orderPositionQueries.countForStatus(
1170+
event_slug = list.eventSlug,
1171+
include_pending = list.includePending,
1172+
subevent_id = subEventId,
1173+
not_all_items = notAllItems,
1174+
list_item_ids = listItemIds,
1175+
only_checked_in_list_server_id = -1L,
1176+
item_id = product.id,
1177+
variation_id = `var`.server_id,
1178+
).executeAsOne().toInt()
1179+
1180+
val ci_count = db.orderPositionQueries.countForStatus(
1181+
event_slug = list.eventSlug,
1182+
include_pending = list.includePending,
1183+
subevent_id = subEventId,
1184+
not_all_items = notAllItems,
1185+
list_item_ids = listItemIds,
1186+
only_checked_in_list_server_id = list.serverId,
1187+
item_id = product.id,
1188+
variation_id = `var`.server_id,
1189+
).executeAsOne().toInt()
1190+
12051191
variations.add(TicketCheckProvider.StatusResultItemVariation(
12061192
`var`.server_id,
12071193
`var`.stringValue,
12081194
position_count,
12091195
ci_count
12101196
))
12111197
}
1212-
val position_count = basePositionQuery(listOf(list), false)
1213-
.and(OrderPosition.ITEM_ID.eq(product.id)).get()!!.value()!!
1214-
val ci_count = basePositionQuery(listOf(list), true)
1215-
.and(OrderPosition.ITEM_ID.eq(product.id)).get()!!.value()!!
1198+
1199+
val position_count = db.orderPositionQueries.countForStatus(
1200+
event_slug = list.eventSlug,
1201+
include_pending = list.includePending,
1202+
subevent_id = subEventId,
1203+
not_all_items = notAllItems,
1204+
list_item_ids = listItemIds,
1205+
only_checked_in_list_server_id = -1L,
1206+
item_id = product.id,
1207+
variation_id = -1L,
1208+
).executeAsOne().toInt()
1209+
1210+
val ci_count = db.orderPositionQueries.countForStatus(
1211+
event_slug = list.eventSlug,
1212+
include_pending = list.includePending,
1213+
subevent_id = subEventId,
1214+
not_all_items = notAllItems,
1215+
list_item_ids = listItemIds,
1216+
only_checked_in_list_server_id = list.serverId,
1217+
item_id = product.id,
1218+
variation_id = -1L,
1219+
).executeAsOne().toInt()
1220+
12161221
items.add(TicketCheckProvider.StatusResultItem(
12171222
product.serverId,
12181223
product.internalName,

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

+22
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,25 @@ AND (
9797
)
9898
LIMIT :limit
9999
OFFSET :offset;
100+
101+
countForStatus:
102+
-- TODO: Check if DISTINCT is required here
103+
SELECT COUNT(DISTINCT OrderPosition.id)
104+
FROM OrderPosition
105+
LEFT JOIN orders ON OrderPosition.order_ref = orders.id
106+
WHERE(
107+
orders.event_slug = :event_slug
108+
AND CASE WHEN (:include_pending)
109+
THEN orders.status IN ('p', 'n')
110+
ELSE (orders.status = 'p' OR (orders.status = 'n' AND orders.valid_if_pending = TRUE))
111+
END
112+
AND CASE WHEN (:subevent_id > 0) THEN OrderPosition.subevent_id = :subevent_id ELSE TRUE END
113+
AND CASE WHEN (:not_all_items) THEN OrderPosition.item IN :list_item_ids ELSE TRUE END
114+
AND CASE WHEN (:only_checked_in_list_server_id > 0) THEN
115+
(OrderPosition.id IN (SELECT position FROM CheckIn WHERE listId = :only_checked_in_list_server_id AND type = 'entry'))
116+
ELSE
117+
TRUE
118+
END
119+
AND OrderPosition.item = :item_id
120+
AND CASE WHEN (:variation_id > 0) THEN OrderPosition.variation_id = :variation_id ELSE TRUE END
121+
);

0 commit comments

Comments
 (0)