1efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar/*
2efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * Copyright (C) 2016 The Android Open Source Project
3efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar *
4efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * you may not use this file except in compliance with the License.
6efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * You may obtain a copy of the License at
7efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar *
8efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar *
10efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * See the License for the specific language governing permissions and
14efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * limitations under the License.
15efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar */
16efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar
17bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room.solver.query.result
18efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar
19bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ext.L
20bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ext.T
21bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.ext.typeName
22bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport androidx.room.solver.CodeGenScope
23efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyarimport defaultValue
24efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar
25efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar/**
26efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar * Wraps a row adapter when there is only 1 item in the result
27efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar */
28092164e5501d0a254001225acd9dca42e5fa57e9Yigit Boyarclass SingleEntityQueryResultAdapter(rowAdapter: RowAdapter) : QueryResultAdapter(rowAdapter) {
29efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar    val type = rowAdapter.out
30efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar    override fun convert(outVarName: String, cursorVarName: String, scope: CodeGenScope) {
31efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar        scope.builder().apply {
32092164e5501d0a254001225acd9dca42e5fa57e9Yigit Boyar            rowAdapter?.onCursorReady(cursorVarName, scope)
33efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar            addStatement("final $T $L", type.typeName(), outVarName)
34efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar            beginControlFlow("if($L.moveToFirst())", cursorVarName)
35092164e5501d0a254001225acd9dca42e5fa57e9Yigit Boyar                rowAdapter?.convert(outVarName, cursorVarName, scope)
36efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar            nextControlFlow("else").apply {
37092164e5501d0a254001225acd9dca42e5fa57e9Yigit Boyar                addStatement("$L = $L", outVarName, rowAdapter?.out?.defaultValue())
38efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar            }
39efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar            endControlFlow()
40092164e5501d0a254001225acd9dca42e5fa57e9Yigit Boyar            rowAdapter?.onCursorFinished()?.invoke(scope)
41efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar        }
42efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar    }
43efaf86afac3163868eda7f91a1c04e3f6e6d7520Yigit Boyar}
44