|
26 | 26 | import java.util.LinkedHashMap; |
27 | 27 | import java.util.List; |
28 | 28 | import java.util.Map; |
| 29 | +import java.util.OptionalLong; |
29 | 30 | import java.util.Set; |
30 | 31 | import java.util.function.BiFunction; |
31 | 32 | import java.util.function.Function; |
|
43 | 44 | import org.springframework.data.r2dbc.dialect.BindMarkers; |
44 | 45 | import org.springframework.data.r2dbc.dialect.BindMarkersFactory; |
45 | 46 | import org.springframework.data.r2dbc.dialect.Dialect; |
46 | | -import org.springframework.data.r2dbc.dialect.LimitClause; |
47 | | -import org.springframework.data.r2dbc.dialect.LimitClause.Position; |
48 | 47 | import org.springframework.data.r2dbc.function.convert.EntityRowMapper; |
49 | 48 | import org.springframework.data.r2dbc.function.convert.R2dbcCustomConversions; |
50 | 49 | import org.springframework.data.r2dbc.function.convert.SettableValue; |
| 50 | +import org.springframework.data.r2dbc.support.StatementRenderUtil; |
51 | 51 | import org.springframework.data.relational.core.conversion.BasicRelationalConverter; |
52 | 52 | import org.springframework.data.relational.core.conversion.RelationalConverter; |
53 | 53 | import org.springframework.data.relational.core.mapping.RelationalMappingContext; |
54 | 54 | import org.springframework.data.relational.core.mapping.RelationalPersistentEntity; |
55 | 55 | import org.springframework.data.relational.core.mapping.RelationalPersistentProperty; |
| 56 | +import org.springframework.data.relational.core.sql.Expression; |
| 57 | +import org.springframework.data.relational.core.sql.OrderByField; |
| 58 | +import org.springframework.data.relational.core.sql.SelectBuilder.SelectFromAndOrderBy; |
| 59 | +import org.springframework.data.relational.core.sql.StatementBuilder; |
| 60 | +import org.springframework.data.relational.core.sql.Table; |
56 | 61 | import org.springframework.data.util.TypeInformation; |
57 | 62 | import org.springframework.lang.Nullable; |
58 | 63 | import org.springframework.util.Assert; |
@@ -312,94 +317,47 @@ public BindableOperation insertAndReturnGeneratedKeys(String table, Set<String> |
312 | 317 | * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#select(java.lang.String, java.util.Set, org.springframework.data.domain.Sort, org.springframework.data.domain.Pageable) |
313 | 318 | */ |
314 | 319 | @Override |
315 | | -public QueryOperation select(String table, Set<String> columns, Sort sort, Pageable page) { |
| 320 | +public String select(String table, Set<String> columns, Sort sort, Pageable page) { |
316 | 321 |
|
317 | | -StringBuilder selectBuilder = new StringBuilder(); |
| 322 | +Table tableToUse = Table.create(table); |
318 | 323 |
|
319 | | -selectBuilder.append("SELECT").append(' ') // |
320 | | -.append(StringUtils.collectionToDelimitedString(columns, ", ")).append(' ') // |
321 | | -.append("FROM").append(' ').append(table); |
| 324 | +Collection<? extends Expression> selectList; |
322 | 325 |
|
323 | | -if (sort.isSorted()) { |
324 | | -selectBuilder.append(' ').append("ORDER BY").append(' ').append(getSortClause(sort)); |
| 326 | +if (columns.isEmpty()) { |
| 327 | +selectList = Collections.singletonList(tableToUse.asterisk()); |
| 328 | +} else { |
| 329 | +selectList = tableToUse.columns(columns); |
325 | 330 | } |
326 | 331 |
|
327 | | -if (page.isPaged()) { |
328 | | - |
329 | | -LimitClause limitClause = dialect.limit(); |
330 | | - |
331 | | -if (limitClause.getClausePosition() == Position.END) { |
332 | | - |
333 | | -selectBuilder.append(' ').append(limitClause.getClause(page.getPageSize(), page.getOffset())); |
334 | | -} |
335 | | -} |
336 | | - |
337 | | -return selectBuilder::toString; |
338 | | -} |
339 | | - |
340 | | -private StringBuilder getSortClause(Sort sort) { |
341 | | - |
342 | | -StringBuilder sortClause = new StringBuilder(); |
| 332 | +SelectFromAndOrderBy selectBuilder = StatementBuilder.select(selectList).from(table) |
| 333 | +.orderBy(createOrderByFields(tableToUse, sort)); |
| 334 | +OptionalLong limit = OptionalLong.empty(); |
| 335 | +OptionalLong offset = OptionalLong.empty(); |
343 | 336 |
|
344 | | -for (Order order : sort) { |
345 | | - |
346 | | -if (sortClause.length() != 0) { |
347 | | -sortClause.append(',').append(' '); |
348 | | -} |
349 | | - |
350 | | -sortClause.append(order.getProperty()).append(' ').append(order.getDirection().isAscending() ? "ASC" : "DESC"); |
| 337 | +if (page.isPaged()) { |
| 338 | +limit = OptionalLong.of(page.getPageSize()); |
| 339 | +offset = OptionalLong.of(page.getOffset()); |
351 | 340 | } |
352 | | -return sortClause; |
353 | | -} |
354 | | - |
355 | | -/* |
356 | | - * (non-Javadoc) |
357 | | - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectById(java.lang.String, java.util.Set, java.lang.String) |
358 | | - */ |
359 | | -@Override |
360 | | -public BindIdOperation selectById(String table, Set<String> columns, String idColumn) { |
361 | | - |
362 | | -return new DefaultBindIdOperation(dialect.getBindMarkersFactory().create(), marker -> { |
363 | 341 |
|
364 | | -String columnClause = StringUtils.collectionToDelimitedString(columns, ", "); |
365 | | - |
366 | | -return String.format("SELECT %s FROM %s WHERE %s = %s", columnClause, table, idColumn, marker.getPlaceholder()); |
367 | | -}); |
| 342 | +return StatementRenderUtil.render(selectBuilder.build(), limit, offset, this.dialect); |
368 | 343 | } |
369 | 344 |
|
370 | | -/* |
371 | | - * (non-Javadoc) |
372 | | - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectById(java.lang.String, java.util.Set, java.lang.String, int) |
373 | | - */ |
374 | | -@Override |
375 | | -public BindIdOperation selectById(String table, Set<String> columns, String idColumn, int limit) { |
376 | | - |
377 | | -LimitClause limitClause = dialect.limit(); |
| 345 | +private Collection<? extends OrderByField> createOrderByFields(Table table, Sort sortToUse) { |
378 | 346 |
|
379 | | -return new DefaultBindIdOperation(dialect.getBindMarkersFactory().create(), marker -> { |
| 347 | +List<OrderByField> fields = new ArrayList<>(); |
380 | 348 |
|
381 | | -String columnClause = StringUtils.collectionToDelimitedString(columns, ", "); |
| 349 | +for (Order order : sortToUse) { |
382 | 350 |
|
383 | | -if (limitClause.getClausePosition() == Position.END) { |
| 351 | +OrderByField orderByField = OrderByField.from(table.column(order.getProperty())); |
384 | 352 |
|
385 | | -return String.format("SELECT %s FROM %s WHERE %s = %s ORDER BY %s %s", columnClause, table, idColumn, |
386 | | -marker.getPlaceholder(), idColumn, limitClause.getClause(limit)); |
| 353 | +if (order.getDirection() != null) { |
| 354 | +fields.add(order.isAscending() ? orderByField.asc() : orderByField.desc()); |
| 355 | +} else { |
| 356 | +fields.add(orderByField); |
387 | 357 | } |
| 358 | +} |
388 | 359 |
|
389 | | -throw new UnsupportedOperationException( |
390 | | -String.format("Limit clause position %s not supported!", limitClause.getClausePosition())); |
391 | | -}); |
392 | | -} |
393 | | - |
394 | | -/* |
395 | | - * (non-Javadoc) |
396 | | - * @see org.springframework.data.r2dbc.function.ReactiveDataAccessStrategy#selectByIdIn(java.lang.String, java.util.Set, java.lang.String) |
397 | | - */ |
398 | | -@Override |
399 | | -public BindIdOperation selectByIdIn(String table, Set<String> columns, String idColumn) { |
400 | | - |
401 | | -String query = String.format("SELECT %s FROM %s", StringUtils.collectionToDelimitedString(columns, ", "), table); |
402 | | -return new DefaultBindIdIn(dialect.getBindMarkersFactory().create(), query, idColumn); |
| 360 | +return fields; |
403 | 361 | } |
404 | 362 |
|
405 | 363 | /* |
|
0 commit comments