diff --git a/app/schemas/app.closer.data.local.AppDatabase/1.json b/app/schemas/app.closer.data.local.AppDatabase/1.json index 1e872f51..b63dc2db 100644 --- a/app/schemas/app.closer.data.local.AppDatabase/1.json +++ b/app/schemas/app.closer.data.local.AppDatabase/1.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "7d88101b5a057ac275bdc43a65fb2380", + "identityHash": "7e7d78fcca52e788c28d1d1090c6d608", "entities": [ { "tableName": "question", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `category_id` TEXT NOT NULL, `depth_level` INTEGER NOT NULL, `is_premium` INTEGER NOT NULL, `type` TEXT NOT NULL, `tags` TEXT NOT NULL, `answer_config` TEXT NOT NULL, `pack_id` TEXT, `created_at` INTEGER NOT NULL, `status` TEXT NOT NULL, PRIMARY KEY(`id`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `text` TEXT NOT NULL, `category_id` TEXT NOT NULL, `depth_level` INTEGER NOT NULL, `is_premium` INTEGER NOT NULL, `type` TEXT NOT NULL, `tags` TEXT NOT NULL, `answer_config` TEXT NOT NULL, `pack_id` TEXT, `created_at` INTEGER NOT NULL, `status` TEXT NOT NULL, `sex` TEXT, PRIMARY KEY(`id`))", "fields": [ { "fieldPath": "id", @@ -73,6 +73,12 @@ "columnName": "status", "affinity": "TEXT", "notNull": true + }, + { + "fieldPath": "sex", + "columnName": "sex", + "affinity": "TEXT", + "notNull": false } ], "primaryKey": { @@ -298,7 +304,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7d88101b5a057ac275bdc43a65fb2380')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7e7d78fcca52e788c28d1d1090c6d608')" ] } } \ No newline at end of file diff --git a/app/src/main/assets/database/app.db b/app/src/main/assets/database/app.db index 49e58262..2335471c 100644 Binary files a/app/src/main/assets/database/app.db and b/app/src/main/assets/database/app.db differ diff --git a/app/src/main/java/app/closer/data/local/QuestionDao.kt b/app/src/main/java/app/closer/data/local/QuestionDao.kt index 41e4bdf9..ac385898 100644 --- a/app/src/main/java/app/closer/data/local/QuestionDao.kt +++ b/app/src/main/java/app/closer/data/local/QuestionDao.kt @@ -27,8 +27,8 @@ interface QuestionDao { @Query("SELECT * FROM question WHERE type IN ('single_choice', 'this_or_that', 'scale') AND status = 'active'") suspend fun getQuestionsForPrediction(): List - @Query("SELECT * FROM question WHERE id LIKE :pattern AND status = 'active'") - suspend fun getDesireSyncQuestions(pattern: String): List + @Query("SELECT * FROM question WHERE sex = :sex AND status = 'active'") + suspend fun getDesireSyncQuestions(sex: String): List @Query("SELECT * FROM question WHERE is_premium = 0 AND status = 'active'") suspend fun getFreeQuestions(): List diff --git a/app/src/main/java/app/closer/data/local/entity/QuestionEntity.kt b/app/src/main/java/app/closer/data/local/entity/QuestionEntity.kt index da34f90c..f9e7db30 100644 --- a/app/src/main/java/app/closer/data/local/entity/QuestionEntity.kt +++ b/app/src/main/java/app/closer/data/local/entity/QuestionEntity.kt @@ -16,5 +16,6 @@ data class QuestionEntity( @ColumnInfo(name = "answer_config") val answerConfig: String, @ColumnInfo(name = "pack_id") val packId: String?, @ColumnInfo(name = "created_at") val createdAt: Long, - @ColumnInfo val status: String + @ColumnInfo val status: String, + @ColumnInfo val sex: String? = null ) diff --git a/app/src/main/java/app/closer/data/local/mapper/QuestionMapper.kt b/app/src/main/java/app/closer/data/local/mapper/QuestionMapper.kt index 241e3d9b..91ebb089 100644 --- a/app/src/main/java/app/closer/data/local/mapper/QuestionMapper.kt +++ b/app/src/main/java/app/closer/data/local/mapper/QuestionMapper.kt @@ -28,7 +28,8 @@ fun QuestionEntity.toQuestion(): Question { answerConfig = parseAnswerConfig(answerConfig, type), packId = packId, createdAt = createdAt, - status = status + status = status, + sex = sex ) } diff --git a/app/src/main/java/app/closer/data/repository/RoomQuestionRepository.kt b/app/src/main/java/app/closer/data/repository/RoomQuestionRepository.kt index a3167f09..eba00618 100644 --- a/app/src/main/java/app/closer/data/repository/RoomQuestionRepository.kt +++ b/app/src/main/java/app/closer/data/repository/RoomQuestionRepository.kt @@ -48,6 +48,6 @@ class RoomQuestionRepository @Inject constructor( } override suspend fun getDesireSyncQuestions(sex: String): List { - return questionDao.getDesireSyncQuestions("sexual_preferences_${sex}_%").map { it.toQuestion() } + return questionDao.getDesireSyncQuestions(sex).map { it.toQuestion() } } } diff --git a/app/src/main/java/app/closer/domain/model/Question.kt b/app/src/main/java/app/closer/domain/model/Question.kt index 3c89f554..2c674289 100644 --- a/app/src/main/java/app/closer/domain/model/Question.kt +++ b/app/src/main/java/app/closer/domain/model/Question.kt @@ -64,5 +64,6 @@ data class Question( val answerConfig: AnswerConfig? = null, val packId: String? = null, val createdAt: Long = System.currentTimeMillis(), - val status: String = "active" + val status: String = "active", + val sex: String? = null ) diff --git a/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt b/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt index b60d9e37..a818c0aa 100644 --- a/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt +++ b/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt @@ -130,8 +130,10 @@ class DesireSyncViewModel @Inject constructor( .onFailure { Log.w(TAG, "load male failed", it) } .getOrElse { emptyList() } - val maleById = male.associateBy { it.id.replace("_male_", "_") } - val pairs = female + val filteredFemale = female.filter { it.sex == "female" } + val filteredMale = male.filter { it.sex == "male" } + val maleById = filteredMale.associateBy { it.id.replace("_male_", "_") } + val pairs = filteredFemale .filter { isBinaryQuestion(it) } .shuffled() .take(SESSION_SIZE) diff --git a/seed/build_db.py b/seed/build_db.py index 27312977..ec985762 100644 --- a/seed/build_db.py +++ b/seed/build_db.py @@ -60,6 +60,7 @@ def build_database(json_dir: str, output_path: str) -> None: pack_id TEXT, created_at INTEGER NOT NULL, status TEXT NOT NULL, + sex TEXT, PRIMARY KEY (id) ) ''') @@ -198,12 +199,15 @@ def build_database(json_dir: str, output_path: str) -> None: tags_json = json.dumps(tags, separators=(',', ':')) ac_json_str = json.dumps(ac_json, separators=(',', ':')) + # Extract optional sex field (used for Desire Sync filtering) + sex = q.get('sex') + # Insert question cursor.execute(''' INSERT OR REPLACE INTO Question (id, text, category_id, depth_level, is_premium, type, tags, answer_config, - created_at, status) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + created_at, status, sex) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( question_id, text, @@ -214,7 +218,8 @@ def build_database(json_dir: str, output_path: str) -> None: tags_json, ac_json_str, int(json_file.stat().st_mtime), # Use file mtime as created_at - 'active' + 'active', + sex )) questions_inserted += 1