package org.simantics.district.network.techtype.requests; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.common.procedure.adapter.TransientCacheListener; import org.simantics.db.common.request.BinaryRead; import org.simantics.db.exception.DatabaseException; import org.simantics.district.network.ontology.DistrictNetworkResource; import org.simantics.district.network.techtype.TechTypeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Get a map of tech type table records, indexed by the key column. * * The query result value is list of records in the form of a map from property name * to string value. * * The second constructor argument allows selection of enabled records only. * * @author Reino Ruusu */ public class TechTypeTableData extends BinaryRead>> { final static Logger LOGGER = LoggerFactory.getLogger(TechTypeTableData.class); public TechTypeTableData(Resource table) { super(table, Boolean.FALSE); } public TechTypeTableData(Resource table, boolean enabledOnly) { super(table, enabledOnly); } @Override public Map> perform(ReadGraph graph) throws DatabaseException { Resource table = this.parameter; boolean enabledOnly = this.parameter2; String keyName = getKeyName(graph, table); List> records = graph.syncRequest(new TechTypeTableRecords(table), TransientCacheListener.instance()); if (records == null || records.size() < 2) return Collections.emptyMap(); Stream> enabled; if (enabledOnly) { int[] enabledKeys = graph.getRelatedValue2(table, DistrictNetworkResource.getInstance(graph).TechType_TechTypeTable_HasEnabledItems, Bindings.INT_ARRAY); enabled = Arrays.stream(enabledKeys) .filter(i -> i >= 0 && i < records.size()) .mapToObj(i -> records.get(i)); } else { enabled = records.stream(); } return enabled .filter(r -> r.containsKey(keyName)) .collect(Collectors.toMap(r -> r.get(keyName), r -> r, (p, q) -> p)); } private String getKeyName(ReadGraph graph, Resource table) throws DatabaseException { String keyName = TechTypeUtils.getKeyPropertyName(graph, table); if (keyName.startsWith("_")) keyName = keyName.substring(1); return keyName; } }