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