Skip to content

Commit

Permalink
Don't expand queries for JSON lists (#1264)
Browse files Browse the repository at this point in the history
  • Loading branch information
dstepanov committed Jan 17, 2022
1 parent 25e2e70 commit c48baba
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,9 @@ private boolean isExpandable(BindingContext bindingContext, DataType dataType) {
if (parameterElement != null && parameterElement.isAnnotationPresent(Expandable.class)) {
return true;
}
if (dataType == DataType.JSON) {
return false;
}
if (!dataType.isArray() && (parameterElement == null || parameterElement.getType().isAssignable(Iterable.class.getName()))) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,10 @@ interface MyRepository {

expect:
builder.dialect == Dialect.POSTGRES
builder.buildQuery(queryModel).query == 'SELECT sale_.id,sale_.name,sale_.data,sale_.quantities,sale_.extra_data FROM sale sale_ WHERE (sale_.name = $1)'
builder.buildQuery(queryModel).query == 'SELECT sale_.id,sale_.name,sale_.data,sale_.quantities,sale_.extra_data,sale_.data_list FROM sale sale_ WHERE (sale_.name = $1)'
builder.buildDelete(queryModel).query == 'DELETE FROM sale WHERE (name = $1)'
builder.buildUpdate(queryModel, Arrays.asList("name")).query == 'UPDATE sale SET name=$1 WHERE (name = $2)'
builder.buildInsert(annotationMetadata, entity).query == 'INSERT INTO sale (name,data,quantities,extra_data) VALUES ($1,to_json($2::json),to_json($3::json),to_json($4::json))'
builder.buildInsert(annotationMetadata, entity).query == 'INSERT INTO sale (name,data,quantities,extra_data,data_list) VALUES ($1,to_json($2::json),to_json($3::json),to_json($4::json),to_json($5::json))'
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import io.micronaut.data.model.runtime.RuntimePersistentEntity;
import io.micronaut.data.model.runtime.RuntimePersistentProperty;

import java.util.Collections;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -140,7 +141,7 @@ public <K, Cnt, PS> void setParameters(OpContext<Cnt, PS> context, Cnt connectio
}

DataType dataType = queryParameterBinding.getDataType();
List<Object> values = expandValue(value, dataType);
List<Object> values = queryParameterBinding.isExpandable() ? expandValue(value, dataType) : Collections.singletonList(value);
if (values != null && values.isEmpty()) {
// Empty collections / array should always set at least one value
value = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public <T, Cnt, PS> void setParameters(OpContext<Cnt, PS> context,
if (previousValues != null) {
Object previousValue = previousValues.get(binding);
if (previousValue != null) {
index = setStatementParameter(context, stmt, index, pp.getProperty().getDataType(), previousValue, dialect);
index = setStatementParameter(context, stmt, index, pp.getProperty().getDataType(), previousValue, dialect, binding.isExpandable());
continue;
}
}
Expand Down Expand Up @@ -220,13 +220,13 @@ public <T, Cnt, PS> void setParameters(OpContext<Cnt, PS> context,
}
value = context.convert(connection, value, property);

index = setStatementParameter(context, stmt, index, type, value, dialect);
index = setStatementParameter(context, stmt, index, type, value, dialect, binding.isExpandable());
}
}

private <PS> int setStatementParameter(OpContext<?, PS> context, PS preparedStatement, int index, DataType dataType, Object value, Dialect dialect) {
private <PS> int setStatementParameter(OpContext<?, PS> context, PS preparedStatement, int index, DataType dataType, Object value, Dialect dialect, boolean isExpandable) {
if (expandableQuery) {
List<Object> values = expandValue(value, dataType);
List<Object> values = isExpandable ? expandValue(value, dataType) : Collections.singletonList(value);
if (values != null && values.isEmpty()) {
value = null;
values = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,20 +86,23 @@ abstract class AbstractJSONSpec extends Specification {
Sale sale = new Sale()
sale.setName("test 1")
sale.data = [foo:'bar']
sale.dataList = ['abc1', 'abc2']
saleRepository.save(sale)
sale = saleRepository.findById(sale.id).orElse(null)

then:
sale.name == 'test 1'
sale.data == [foo:'bar']
sale.dataList == ['abc1', 'abc2']

when:
saleRepository.updateData(sale.id,[foo:'changed'] )
saleRepository.updateData(sale.id, [foo:'changed'], ['changed1', 'changed2', 'changed3'])
sale = saleRepository.findById(sale.id).orElse(null)

then:
sale.name == 'test 1'
sale.data == [foo:'changed']
sale.dataList == ['changed1', 'changed2', 'changed3']

cleanup:
cleanup()
Expand Down
20 changes: 19 additions & 1 deletion data-tck/src/main/java/io/micronaut/data/tck/entities/Sale.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@
package io.micronaut.data.tck.entities;

import io.micronaut.core.annotation.Nullable;
import io.micronaut.data.annotation.*;
import io.micronaut.data.annotation.GeneratedValue;
import io.micronaut.data.annotation.Id;
import io.micronaut.data.annotation.MappedEntity;
import io.micronaut.data.annotation.Relation;
import io.micronaut.data.annotation.TypeDef;
import io.micronaut.data.model.DataType;

import java.util.List;
import java.util.Map;
import java.util.Set;

Expand All @@ -42,6 +47,10 @@ public class Sale {
@Nullable
private Map<String, Integer> quantities;

@TypeDef(type = DataType.JSON)
@Nullable
private List<String> dataList;

@Relation(
value = Relation.Kind.ONE_TO_MANY,
mappedBy = "sale")
Expand Down Expand Up @@ -94,4 +103,13 @@ public Set<SaleItem> getItems() {
public void setItems(Set<SaleItem> items) {
this.items = items;
}

@Nullable
public List<String> getDataList() {
return dataList;
}

public void setDataList(@Nullable List<String> dataList) {
this.dataList = dataList;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.micronaut.data.tck.entities.SaleDTO;
import org.jetbrains.annotations.NotNull;

import java.util.List;
import java.util.Map;
import java.util.Optional;

Expand All @@ -35,6 +36,6 @@ public interface SaleRepository extends CrudRepository<Sale, Long> {
@Join(value = "items", type = Join.Type.LEFT_FETCH)
Optional<Sale> findById(@NotNull Long id);

void updateData(@Id Long id, @Parameter("data") Map<String, String> data);
void updateData(@Id Long id, @Parameter("data") Map<String, String> data, @Parameter("dataList") List<String> dataList);

}

0 comments on commit c48baba

Please sign in to comment.