Merge "Added the annotation for upsert function" into androidx-main am: 35a7cf0f7e
Original change: https://android-review.googlesource.com/c/platform/frameworks/support/+/2151996
Change-Id: Ib39c6a6b7ace356efc750922dbd10d962841110f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/room/room-common/src/main/java/androidx/room/Upsert.kt b/room/room-common/src/main/java/androidx/room/Upsert.kt
new file mode 100644
index 0000000..3b29b35
--- /dev/null
+++ b/room/room-common/src/main/java/androidx/room/Upsert.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * 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
+ *
+ * http://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 androidx.room
+
+import androidx.annotation.RestrictTo
+import androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP
+import kotlin.reflect.KClass
+
+/**
+ * Marks a method in a [Dao] annotated class as an upsert (insert or update) method.
+ *
+ * The implementation of the method will insert its parameters into the database
+ * if it does not already exists (checked by primary key). If it already exists,
+ * it will update its parameters in the database.
+ *
+ * All of the parameters of the upsert method must either be classes annotated with [Entity]
+ * or collections/array of it.
+ *
+ * Example:
+ *
+ * ```
+ * TODO
+ * ```
+ *
+ * If the target entity is specified via [entity] then the parameters can be of arbitrary
+ * POJO types that will be interpreted as partial entities. For example:
+ *
+ * ```
+ * TODO
+ * ```
+ *
+ * @see [Insert]
+ * @see [Update]
+ */
+@Target(AnnotationTarget.FUNCTION)
+@Retention(AnnotationRetention.BINARY)
+@RestrictTo(LIBRARY_GROUP)
+public annotation class Upsert(
+
+ /**
+ * The target entity of the upsert method.
+ *
+ * When this is declared, the upsert method parameters are interpreted as partial entities when
+ * the type of the parameter differs from the target. The POJO class that represents the entity
+ * must contain all of the non-null fields without default values of the target entity.
+ *
+ * If the target entity contains a [PrimaryKey] that is auto generated, then the POJO
+ * class doesn't need an equal primary key field, otherwise primary keys must also be present
+ * in the POJO. If the primary key already exists, only the columns represented by the partial
+ * entity fields will be updated
+ *
+ * By default the target entity is interpreted by the method parameters.
+ *
+ * @return the target entity of the upsert method or none if the method should use the
+ * parameter type entities.
+ */
+ val entity: KClass<*> = Any::class,
+
+ )