@@ -8,6 +8,9 @@ import io.github.jan.supabase.gotrue.PostgrestFilterDSL
8
8
import io.github.jan.supabase.postgrest.Postgrest
9
9
import io.github.jan.supabase.postgrest.executor.RestRequestExecutor
10
10
import io.github.jan.supabase.postgrest.mapToFirstValue
11
+ import io.github.jan.supabase.postgrest.query.request.InsertPostgrestRequestBuilder
12
+ import io.github.jan.supabase.postgrest.query.request.SelectPostgrestRequestBuilder
13
+ import io.github.jan.supabase.postgrest.query.request.UpsertPostgrestRequestBuilder
11
14
import io.github.jan.supabase.postgrest.request.DeleteRequest
12
15
import io.github.jan.supabase.postgrest.request.InsertRequest
13
16
import io.github.jan.supabase.postgrest.request.SelectRequest
@@ -30,23 +33,21 @@ class PostgrestQueryBuilder(
30
33
* Executes vertical filtering with select on [table]
31
34
*
32
35
* @param columns The columns to retrieve, defaults to [Columns.ALL]. You can also use [Columns.list], [Columns.type] or [Columns.raw] to specify the columns
33
- * @param head If true, no body will be returned. Useful when using count.
34
- * @param request Additional filtering to apply to the query
36
+ * @param request Additional configurations for the request including filters
35
37
* @return PostgrestResult which is either an error, an empty JsonArray or the data you requested as an JsonArray
36
38
* @throws RestException or one of its subclasses if receiving an error response
37
39
* @throws HttpRequestTimeoutException if the request timed out
38
40
* @throws HttpRequestException on network related issues
39
41
*/
40
42
suspend inline fun select (
41
43
columns : Columns = Columns .ALL ,
42
- head : Boolean = false,
43
- request : @PostgrestFilterDSL PostgrestRequestBuilder .() -> Unit = {}
44
+ request : @PostgrestFilterDSL SelectPostgrestRequestBuilder .() -> Unit = {}
44
45
): PostgrestResult {
45
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod) {
46
+ val requestBuilder = SelectPostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply {
46
47
request(); params[" select" ] = listOf (columns.value)
47
48
}
48
49
val selectRequest = SelectRequest (
49
- head = head,
50
+ head = requestBuilder. head,
50
51
count = requestBuilder.count,
51
52
urlParams = requestBuilder.params.mapToFirstValue(),
52
53
schema = schema,
@@ -57,38 +58,28 @@ class PostgrestQueryBuilder(
57
58
58
59
/* *
59
60
* Perform an UPSERT on the table or view. Depending on the column(s) passed
60
- * to [onConflict], [upsert] allows you to perform the equivalent of
61
+ * to [UpsertPostgrestRequestBuilder. onConflict], [upsert] allows you to perform the equivalent of
61
62
* `[insert] if a row with the corresponding onConflict columns doesn't
62
63
* exist, or if it does exist, perform an alternative action depending on
63
- * [ignoreDuplicates].
64
+ * [UpsertPostgrestRequestBuilder. ignoreDuplicates].
64
65
*
65
66
* By default, upserted rows are not returned. To return it, call `[PostgrestRequestBuilder.select]`.
66
67
*
67
68
* @param values The values to insert, will automatically get serialized into json.
68
- * @param request Additional filtering to apply to the query
69
- * @param onConflict Comma-separated UNIQUE column(s) to specify how
70
- * duplicate rows are determined. Two rows are duplicates if all the
71
- * `onConflict` columns are equal.
72
- * @param defaultToNull Make missing fields default to `null`.
73
- * Otherwise, use the default value for the column. This only applies when
74
- * inserting new rows, not when merging with existing rows under
75
- * @param ignoreDuplicates If `true`, duplicate rows are ignored. If `false`, duplicate rows are merged with existing rows.
69
+ * @param request Additional configurations for the request including filters
76
70
* @throws RestException or one of its subclasses if receiving an error response
77
71
* @throws HttpRequestTimeoutException if the request timed out
78
72
* @throws HttpRequestException on network related issues
79
73
*/
80
74
suspend inline fun <reified T : Any > upsert (
81
75
values : List <T >,
82
- onConflict : String? = null,
83
- defaultToNull : Boolean = true,
84
- ignoreDuplicates : Boolean = false,
85
- request : PostgrestRequestBuilder .() -> Unit = {}
76
+ request : UpsertPostgrestRequestBuilder .() -> Unit = {}
86
77
): PostgrestResult {
87
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod, request)
78
+ val requestBuilder = UpsertPostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply ( request)
88
79
val body = postgrest.serializer.encodeToJsonElement(values).jsonArray
89
80
val columns = body.map { it.jsonObject.keys }.flatten().distinct()
90
81
requestBuilder.params[" columns" ] = listOf (columns.joinToString(" ," ))
91
- onConflict?.let {
82
+ requestBuilder. onConflict?.let {
92
83
requestBuilder.params[" on_conflict" ] = listOf (it)
93
84
}
94
85
val insertRequest = InsertRequest (
@@ -97,8 +88,8 @@ class PostgrestQueryBuilder(
97
88
returning = requestBuilder.returning,
98
89
count = requestBuilder.count,
99
90
urlParams = requestBuilder.params.mapToFirstValue(),
100
- defaultToNull = defaultToNull,
101
- ignoreDuplicates = ignoreDuplicates,
91
+ defaultToNull = requestBuilder. defaultToNull,
92
+ ignoreDuplicates = requestBuilder. ignoreDuplicates,
102
93
schema = schema,
103
94
headers = requestBuilder.headers.build()
104
95
)
@@ -107,52 +98,38 @@ class PostgrestQueryBuilder(
107
98
108
99
/* *
109
100
* Perform an UPSERT on the table or view. Depending on the column(s) passed
110
- * to [onConflict], [upsert] allows you to perform the equivalent of
101
+ * to [UpsertPostgrestRequestBuilder. onConflict], [upsert] allows you to perform the equivalent of
111
102
* `[insert] if a row with the corresponding onConflict columns doesn't
112
103
* exist, or if it does exist, perform an alternative action depending on
113
- * [ignoreDuplicates].
104
+ * [UpsertPostgrestRequestBuilder. ignoreDuplicates].
114
105
*
115
106
* By default, upserted rows are not returned. To return it, call `[PostgrestRequestBuilder.select]`.
116
107
*
117
108
* @param value The value to insert, will automatically get serialized into json.
118
109
* @param request Additional filtering to apply to the query
119
- * @param onConflict Comma-separated UNIQUE column(s) to specify how
120
- * duplicate rows are determined. Two rows are duplicates if all the
121
- * `onConflict` columns are equal.
122
- * @param defaultToNull Make missing fields default to `null`.
123
- * Otherwise, use the default value for the column. This only applies when
124
- * inserting new rows, not when merging with existing rows under
125
- * @param ignoreDuplicates If `true`, duplicate rows are ignored. If `false`, duplicate rows are merged with existing rows.
126
110
* @throws RestException or one of its subclasses if receiving an error response
127
111
* @throws HttpRequestTimeoutException if the request timed out
128
112
* @throws HttpRequestException on network related issues
129
113
*/
130
114
suspend inline fun <reified T : Any > upsert (
131
115
value : T ,
132
- onConflict : String? = null,
133
- defaultToNull : Boolean = true,
134
- ignoreDuplicates : Boolean = false,
135
- request : PostgrestRequestBuilder .() -> Unit = {}
136
- ): PostgrestResult = upsert(listOf (value), onConflict, defaultToNull, ignoreDuplicates, request)
116
+ request : UpsertPostgrestRequestBuilder .() -> Unit = {}
117
+ ): PostgrestResult = upsert(listOf (value), request)
137
118
138
119
/* *
139
120
* Executes an insert operation on the [table]
140
121
*
141
122
* @param values The values to insert, will automatically get serialized into json.
142
123
* @param request Additional filtering to apply to the query
143
- * @param defaultToNull Make missing fields default to `null`.
144
- * Otherwise, use the default value for the column. This only applies when
145
- * inserting new rows, not when merging with existing rows under
146
124
* @throws RestException or one of its subclasses if receiving an error response
147
125
* @throws HttpRequestTimeoutException if the request timed out
148
126
* @throws HttpRequestException on network related issues
149
127
*/
150
128
suspend inline fun <reified T : Any > insert (
151
129
values : List <T >,
152
- defaultToNull : Boolean = true,
153
- request : PostgrestRequestBuilder .() -> Unit = {}
130
+ request : InsertPostgrestRequestBuilder .() -> Unit = {}
154
131
): PostgrestResult {
155
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod, request)
132
+ val requestBuilder = InsertPostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply ( request)
156
133
val body = postgrest.serializer.encodeToJsonElement(values).jsonArray
157
134
val columns = body.map { it.jsonObject.keys }.flatten().distinct()
158
135
requestBuilder.params[" columns" ] = listOf (columns.joinToString(" ," ))
@@ -163,7 +140,7 @@ class PostgrestQueryBuilder(
163
140
urlParams = requestBuilder.params.mapToFirstValue(),
164
141
schema = schema,
165
142
headers = requestBuilder.headers.build(),
166
- defaultToNull = defaultToNull
143
+ defaultToNull = requestBuilder. defaultToNull
167
144
)
168
145
return RestRequestExecutor .execute(postgrest = postgrest, path = table, request = insertRequest)
169
146
}
@@ -173,18 +150,14 @@ class PostgrestQueryBuilder(
173
150
*
174
151
* @param value The value to insert, will automatically get serialized into json.
175
152
* @param request Additional filtering to apply to the query
176
- * @param defaultToNull Make missing fields default to `null`.
177
- * Otherwise, use the default value for the column. This only applies when
178
- * inserting new rows, not when merging with existing rows under
179
153
* @throws RestException or one of its subclasses if receiving an error response
180
154
* @throws HttpRequestTimeoutException if the request timed out
181
155
* @throws HttpRequestException on network related issues
182
156
*/
183
157
suspend inline fun <reified T : Any > insert (
184
158
value : T ,
185
- defaultToNull : Boolean = true,
186
- request : PostgrestRequestBuilder .() -> Unit = {}
187
- ) = insert(listOf (value), defaultToNull, request)
159
+ request : InsertPostgrestRequestBuilder .() -> Unit = {}
160
+ ) = insert(listOf (value), request)
188
161
189
162
/* *
190
163
* Executes an update operation on the [table].
@@ -201,7 +174,7 @@ class PostgrestQueryBuilder(
201
174
crossinline update : PostgrestUpdate .() -> Unit = {},
202
175
request : PostgrestRequestBuilder .() -> Unit = {}
203
176
): PostgrestResult {
204
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod, request)
177
+ val requestBuilder = PostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply ( request)
205
178
val updateRequest = UpdateRequest (
206
179
body = buildPostgrestUpdate(postgrest.config.propertyConversionMethod, postgrest.serializer, update),
207
180
returning = requestBuilder.returning,
@@ -228,7 +201,7 @@ class PostgrestQueryBuilder(
228
201
value : T ,
229
202
request : PostgrestRequestBuilder .() -> Unit = {}
230
203
): PostgrestResult {
231
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod, request)
204
+ val requestBuilder = PostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply ( request)
232
205
val updateRequest = UpdateRequest (
233
206
returning = requestBuilder.returning,
234
207
count = requestBuilder.count,
@@ -253,7 +226,7 @@ class PostgrestQueryBuilder(
253
226
suspend inline fun delete (
254
227
request : PostgrestRequestBuilder .() -> Unit = {}
255
228
): PostgrestResult {
256
- val requestBuilder = postgrestRequest (postgrest.config.propertyConversionMethod, request)
229
+ val requestBuilder = PostgrestRequestBuilder (postgrest.config.propertyConversionMethod). apply ( request)
257
230
val deleteRequest = DeleteRequest (
258
231
returning = requestBuilder.returning,
259
232
count = requestBuilder.count,
0 commit comments