Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 7767badf by Tony Chemit at 2024-01-19T15:16:46+01:00 [toolkit-persistence] Add MapBuilder in QuerySupport to be able to build map of list from rows - - - - - 1 changed file: - toolkit/persistence/src/main/java/org/nuiton/topia/persistence/support/QuerySupport.java Changes: ===================================== toolkit/persistence/src/main/java/org/nuiton/topia/persistence/support/QuerySupport.java ===================================== @@ -23,6 +23,7 @@ package org.nuiton.topia.persistence.support; */ import fr.ird.observe.datasource.SqlHelper; +import fr.ird.observe.dto.ToolkitId; import fr.ird.observe.entities.Entity; import fr.ird.observe.spi.context.DataDtoEntityContext; import org.hibernate.query.NativeQuery; @@ -31,14 +32,18 @@ import org.hibernate.query.QueryParameter; import javax.persistence.Parameter; import java.sql.Timestamp; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiConsumer; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** @@ -119,4 +124,36 @@ public interface QuerySupport { default int execute(NativeQuery<?> sqlQuery) { return sqlQuery.executeUpdate(); } + + class MapBuilder<K extends ToolkitId, V> { + + private final Map<K, List<V>> result; + + private final Map<String, K> keysById; + private final BiFunction<K, Object[], V> valueCreator; + + private K currentKey; + private List<V> currentList; + + public MapBuilder(Map<K, List<V>> result, Collection<K> keys, BiFunction<K, Object[], V> valueCreator) { + this.result = result; + this.keysById = keys.stream().collect(Collectors.toMap(ToolkitId::getId, Function.identity())); + this.valueCreator = valueCreator; + keysById.values().forEach(r -> result.put(r, new LinkedList<>())); + } + + public void addRow(Object[] row) { + String keyId = (String) row[0]; + if (currentKey == null || !Objects.equals(currentKey.getId(), keyId)) { + currentKey = keysById.get(keyId); + currentList = result.get(currentKey); + } + currentList.add(valueCreator.apply(currentKey, row)); + } + + public Map<K, List<V>> build(Stream<Object[]> data) { + data.forEach(this::addRow); + return result; + } + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/7767badf24bb8810654ff46d29... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/7767badf24bb8810654ff46d29... You're receiving this email because of your account on gitlab.com.