Skip to content

Commit 04b5936

Browse files
committed
Migrate QuestionSyncAdapter
1 parent 3980be5 commit 04b5936

File tree

7 files changed

+221
-114
lines changed

7 files changed

+221
-114
lines changed

libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/QuestionSyncAdapter.java

-107
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package eu.pretix.libpretixsync.sync
2+
3+
import app.cash.sqldelight.TransactionWithoutReturn
4+
import app.cash.sqldelight.db.QueryResult
5+
import eu.pretix.libpretixsync.api.PretixApi
6+
import eu.pretix.libpretixsync.db.Migrations
7+
import eu.pretix.libpretixsync.sqldelight.Question
8+
import eu.pretix.libpretixsync.sqldelight.SyncDatabase
9+
import eu.pretix.libpretixsync.sync.SyncManager.ProgressFeedback
10+
import eu.pretix.libpretixsync.utils.JSONUtils
11+
import org.json.JSONException
12+
import org.json.JSONObject
13+
14+
class QuestionSyncAdapter(
15+
db: SyncDatabase,
16+
fileStorage: FileStorage,
17+
eventSlug: String,
18+
api: PretixApi,
19+
syncCycleId: String,
20+
feedback: ProgressFeedback?,
21+
) : SqBaseConditionalSyncAdapter<Question, Long>(
22+
db = db,
23+
fileStorage = fileStorage,
24+
eventSlug = eventSlug,
25+
api = api,
26+
syncCycleId = syncCycleId,
27+
feedback = feedback,
28+
) {
29+
30+
override fun getResourceName(): String = "questions"
31+
32+
override fun getId(obj: Question): Long = obj.server_id!!
33+
34+
override fun getId(obj: JSONObject): Long = obj.getLong("id")
35+
36+
override fun getJSON(obj: Question): JSONObject = JSONObject(obj.json_data!!)
37+
38+
override fun queryKnownIDs(): MutableSet<Long>? {
39+
val res = mutableSetOf<Long>()
40+
db.questionQueries.selectServerIdsByEventSlug(event_slug = eventSlug).execute { cursor ->
41+
while (cursor.next().value) {
42+
val id = cursor.getLong(0) ?: throw RuntimeException("id column not available")
43+
res.add(id)
44+
}
45+
46+
QueryResult.Unit
47+
}
48+
49+
return res
50+
}
51+
52+
override fun insert(jsonobj: JSONObject) {
53+
val questionId = db.questionQueries.transactionWithResult {
54+
db.questionQueries.insert(
55+
event_slug = eventSlug,
56+
json_data = jsonobj.toString(),
57+
position = jsonobj.getLong("position"),
58+
required = jsonobj.optBoolean("required", false),
59+
server_id = jsonobj.getLong("id"),
60+
)
61+
db.compatQueries.getLastInsertedQuestionId().executeAsOne()
62+
}
63+
64+
upsertItemRelations(questionId, emptySet(), jsonobj)
65+
}
66+
67+
override fun update(obj: Question, jsonobj: JSONObject) {
68+
val existingRelations = db.questionQueries.selectRelationsForQuestion(obj.id)
69+
.executeAsList()
70+
.map { it.ItemId }
71+
.toSet()
72+
73+
db.questionQueries.updateFromJson(
74+
event_slug = eventSlug,
75+
json_data = jsonobj.toString(),
76+
position = jsonobj.getLong("position"),
77+
required = jsonobj.optBoolean("required", false),
78+
id = obj.id,
79+
)
80+
81+
upsertItemRelations(obj.id, existingRelations, jsonobj)
82+
}
83+
84+
private fun upsertItemRelations(questionId: Long, existingIds: Set<Long>, jsonobj: JSONObject) {
85+
val itemsarr = jsonobj.getJSONArray("items")
86+
val itemids = ArrayList<Long>(itemsarr.length())
87+
for (i in 0 until itemsarr.length()) {
88+
itemids.add(itemsarr.getLong(i))
89+
}
90+
val newIds = db.itemQueries.selectByServerIdListAndEventSlug(
91+
server_id = itemids,
92+
event_slug = eventSlug,
93+
).executeAsList().map { it.id }.toSet()
94+
95+
for (newId in newIds - existingIds) {
96+
db.questionQueries.insertItemRelation(
97+
item_id = newId,
98+
question_id = questionId,
99+
)
100+
}
101+
for (oldId in existingIds - newIds) {
102+
db.questionQueries.deleteItemRelation(
103+
item_id = oldId,
104+
question_id = questionId,
105+
)
106+
}
107+
}
108+
109+
override fun delete(key: Long) {
110+
db.questionQueries.deleteItemRelationsForQuestion(key)
111+
db.questionQueries.deleteByServerId(key)
112+
}
113+
114+
override fun runInTransaction(body: TransactionWithoutReturn.() -> Unit) {
115+
db.questionQueries.transaction(false, body)
116+
}
117+
118+
override fun runBatch(parameterBatch: List<Long>): List<Question> =
119+
db.questionQueries.selectByServerIdListAndEventSlug(
120+
server_id = parameterBatch,
121+
event_slug = eventSlug,
122+
).executeAsList()
123+
124+
@Throws(JSONException::class)
125+
fun standaloneRefreshFromJSON(data: JSONObject) {
126+
val known = db.questionQueries.selectByServerId(data.getLong("id")).executeAsOneOrNull()
127+
128+
// Store object
129+
data.put("__libpretixsync_dbversion", Migrations.CURRENT_VERSION)
130+
data.put("__libpretixsync_syncCycleId", syncCycleId)
131+
if (known == null) {
132+
insert(data)
133+
} else {
134+
val old = JSONObject(known.json_data!!)
135+
if (!JSONUtils.similar(data, old)) {
136+
update(known, data)
137+
}
138+
}
139+
}
140+
141+
}

libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ protected void downloadData(ProgressFeedback feedback, Boolean skip_orders, Stri
423423
}
424424
download(new ItemCategorySyncAdapter(db, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback));
425425
download(new ItemSyncAdapter(db, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback));
426-
download(new QuestionSyncAdapter(dataStore, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback));
426+
download(new QuestionSyncAdapter(db, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback));
427427
if (profile == Profile.PRETIXPOS) {
428428
download(new QuotaSyncAdapter(dataStore, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback, subEvent));
429429
download(new TaxRuleSyncAdapter(db, fileStorage, eventSlug, api, configStore.getSyncCycleId(), feedback));

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

+65
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
selectByServerId:
2+
SELECT *
3+
FROM Question
4+
WHERE server_id = ?;
5+
16
selectForItem:
27
SELECT Question.*
38
FROM Question
@@ -6,3 +11,63 @@ WHERE Question.id IN (
611
FROM Question_Item
712
WHERE Question_Item.ItemId = :item_id
813
);
14+
15+
selectByServerIdListAndEventSlug:
16+
SELECT *
17+
FROM Question
18+
WHERE server_id IN ? AND event_slug = ?;
19+
20+
selectServerIdsByEventSlug:
21+
SELECT server_id
22+
FROM Question
23+
WHERE event_slug = ?;
24+
25+
deleteByServerId:
26+
DELETE FROM Question
27+
WHERE server_id = ?;
28+
29+
insert:
30+
INSERT INTO Question(
31+
event_slug,
32+
json_data,
33+
"position",
34+
required,
35+
server_id
36+
) VALUES(
37+
?,
38+
?,
39+
?,
40+
?,
41+
?
42+
);
43+
44+
selectRelationsForQuestion:
45+
SELECT *
46+
FROM Question_Item
47+
WHERE QuestionId = :question_id;
48+
49+
insertItemRelation:
50+
INSERT INTO Question_Item(
51+
ItemId,
52+
QuestionId
53+
) VALUES(
54+
:item_id,
55+
:question_id
56+
);
57+
58+
deleteItemRelation:
59+
DELETE FROM Question_Item
60+
WHERE ItemId = :item_id AND QuestionId = :question_id;
61+
62+
deleteItemRelationsForQuestion:
63+
DELETE FROM Question_Item
64+
WHERE QuestionId = :question_id;
65+
66+
updateFromJson:
67+
UPDATE Question
68+
SET
69+
event_slug = ?,
70+
json_data = ?,
71+
"position" = ?,
72+
required = ?
73+
WHERE id = ?;

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

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ SELECT currval('checkin_id_seq') AS Long;
1313
getLastInsertedOrderPositionId:
1414
SELECT currval('orderposition_id_seq') AS Long;
1515

16+
-- Switch to RETURNING once it is also supported by SQLite
17+
getLastInsertedQuestionId:
18+
SELECT currval('question_id_seq') AS Long;
19+
1620
truncateAllTables:
1721
TRUNCATE
1822
BadgeLayout,

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

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ SELECT last_insert_rowid();
1313
getLastInsertedOrderPositionId:
1414
SELECT last_insert_rowid();
1515

16+
-- Switch to RETURNING once it is also supported by SQLite
17+
getLastInsertedQuestionId:
18+
SELECT last_insert_rowid();
19+
1620
truncateAllTables {
1721
DELETE FROM BadgeLayout;
1822
DELETE FROM BadgeLayoutItem;

0 commit comments

Comments
 (0)