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,
+
+    )