-
Notifications
You must be signed in to change notification settings - Fork 121
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' into sufy/2300/labeled-lois
- Loading branch information
Showing
25 changed files
with
1,127 additions
and
45 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
87 changes: 87 additions & 0 deletions
87
ground/src/main/java/com/google/android/ground/model/task/Condition.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
/* | ||
* Copyright 2024 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.android.ground.model.task | ||
|
||
import com.google.android.ground.model.submission.MultipleChoiceResponse | ||
import com.google.android.ground.model.submission.Value | ||
|
||
/** The task ID. */ | ||
typealias TaskId = String | ||
/** The selected values keyed by task ID. */ | ||
typealias TaskSelections = Map<String, Value> | ||
|
||
/** | ||
* Describes a user-defined condition on a task, which determines whether the given task should be | ||
* hidden due to failure of fulfillment based on the input expressions. | ||
*/ | ||
data class Condition( | ||
/** Determines the evaluation condition for fulfillment (e.g. all or some expressions). */ | ||
val matchType: MatchType = MatchType.UNKNOWN, | ||
/** The expressions to evaluate to fulfill the condition. */ | ||
val expressions: List<Expression> = listOf(), | ||
) { | ||
|
||
/** Match type names as they appear in the remote database. */ | ||
enum class MatchType { | ||
UNKNOWN, | ||
MATCH_ANY, | ||
MATCH_ALL, | ||
MATCH_ONE, | ||
} | ||
|
||
/** Given the user's task selections, determine whether the condition is fulfilled. */ | ||
fun fulfilledBy(taskSelections: TaskSelections) = | ||
when (matchType) { | ||
MatchType.MATCH_ANY -> expressions.any { it.fulfilledBy(taskSelections) } | ||
MatchType.MATCH_ALL -> expressions.all { it.fulfilledBy(taskSelections) } | ||
MatchType.MATCH_ONE -> expressions.filter { it.fulfilledBy(taskSelections) }.size == 1 | ||
MatchType.UNKNOWN -> throw IllegalArgumentException("Unknown match type: $matchType") | ||
} | ||
} | ||
|
||
data class Expression( | ||
/** Determines the evaluation condition for the expression (e.g. all or some selected options). */ | ||
val expressionType: ExpressionType = ExpressionType.UNKNOWN, | ||
/** The task ID associated with this expression. */ | ||
val taskId: String, | ||
/** The option IDs that need to be selected to fulfill the condition. */ | ||
val optionIds: Set<String> = setOf(), | ||
) { | ||
|
||
/** Task type names as they appear in the remote database. */ | ||
enum class ExpressionType { | ||
UNKNOWN, | ||
ANY_OF_SELECTED, | ||
ALL_OF_SELECTED, | ||
ONE_OF_SELECTED, | ||
} | ||
|
||
/** Given the selected options for this task, determine whether the expression is fulfilled. */ | ||
fun fulfilledBy(taskSelections: TaskSelections): Boolean = | ||
taskSelections[this.taskId]?.let { selection -> this.fulfilled(selection) } ?: false | ||
|
||
private fun fulfilled(value: Value): Boolean { | ||
if (value !is MultipleChoiceResponse) return false | ||
val selectedOptions = value.selectedOptionIds.toSet() | ||
return when (expressionType) { | ||
ExpressionType.ANY_OF_SELECTED -> optionIds.any { it in selectedOptions } | ||
ExpressionType.ALL_OF_SELECTED -> selectedOptions.containsAll(optionIds) | ||
ExpressionType.ONE_OF_SELECTED -> selectedOptions.intersect(optionIds).size == 1 | ||
ExpressionType.UNKNOWN -> | ||
throw IllegalArgumentException("Unknown expression type: $expressionType") | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
ground/src/main/java/com/google/android/ground/persistence/local/room/dao/ConditionDao.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/* | ||
* Copyright 2024 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.android.ground.persistence.local.room.dao | ||
|
||
import androidx.room.Dao | ||
import com.google.android.ground.persistence.local.room.entity.ConditionEntity | ||
|
||
@Dao interface ConditionDao : BaseDao<ConditionEntity> |
21 changes: 21 additions & 0 deletions
21
ground/src/main/java/com/google/android/ground/persistence/local/room/dao/ExpressionDao.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
/* | ||
* Copyright 2024 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.android.ground.persistence.local.room.dao | ||
|
||
import androidx.room.Dao | ||
import com.google.android.ground.persistence.local.room.entity.ExpressionEntity | ||
|
||
@Dao interface ExpressionDao : BaseDao<ExpressionEntity> |
41 changes: 41 additions & 0 deletions
41
.../src/main/java/com/google/android/ground/persistence/local/room/entity/ConditionEntity.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* Copyright 2024 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package com.google.android.ground.persistence.local.room.entity | ||
|
||
import androidx.room.ColumnInfo | ||
import androidx.room.Entity | ||
import androidx.room.ForeignKey | ||
import androidx.room.Index | ||
import androidx.room.PrimaryKey | ||
import com.google.android.ground.persistence.local.room.fields.MatchEntityType | ||
|
||
@Entity( | ||
tableName = "condition", | ||
foreignKeys = | ||
[ | ||
ForeignKey( | ||
entity = TaskEntity::class, | ||
parentColumns = ["id"], | ||
childColumns = ["parent_task_id"], | ||
onDelete = ForeignKey.CASCADE | ||
) | ||
], | ||
indices = [Index("parent_task_id")] | ||
) | ||
data class ConditionEntity( | ||
@ColumnInfo(name = "parent_task_id") @PrimaryKey val parentTaskId: String, | ||
@ColumnInfo(name = "match_type") val matchType: MatchEntityType, | ||
) |
Oops, something went wrong.