private Collection<SIComposite> detectIntancesToDelete(SType<?> listField, SIComposite instance, SIComposite previousInstance) { String fieldName = listField.getNameSimple(); Map<String, SIComposite> previousKeys = new HashMap<>(); for (SIComposite item : previousInstance.getFieldList(fieldName, SIComposite.class).getChildren()) { previousKeys.put(FormKey.fromInstance(item).toStringPersistence(), item); } for (SIComposite item : instance.getFieldList(fieldName, SIComposite.class).getChildren()) { Optional<FormKey> keyToPreserve = FormKey.fromInstanceOpt(item); if (keyToPreserve.isPresent()) { previousKeys.remove(keyToPreserve.get().toStringPersistence()); } } return previousKeys.values(); }
protected void executeSelectField(@Nonnull FormKey key, INSTANCE mainInstance, TYPE mainType, SType<?> field) { SIList<SIComposite> listInstance = mainInstance.getFieldList(field.getNameSimple(), SIComposite.class); for (SType<?> detail : field.getLocalTypes()) { STypeComposite<?> detailType = (STypeComposite<?>) detail.getSuperType(); for (RelationalSQLCommmand command : RelationalSQL.select(detailType.getContainedTypes()) .where(mainType, key).toSQLScript()) { executeSelectCommandIntoSIList(command, listInstance); } } }
public void delete(@Nonnull FormKey key) { INSTANCE mainInstance = load(key); mainInstance.getAllChildren().stream().filter(field -> RelationalSQL.isListWithTableBound(field.getType())) .forEach(field -> { SIList<SIComposite> listInstance = mainInstance.getFieldList(field.getType().getNameSimple(), SIComposite.class); for (SIComposite item : listInstance.getChildren()) { String manyToManyTable = manyToManyTable(item); if (manyToManyTable != null) { executeManyToManyDelete(mainInstance, item, manyToManyTable); } deleteInternal(item.getType(), FormKey.fromInstance(item)); } }); deleteInternal(createType(), key); }
protected void updateFieldInternal(@Nonnull SIComposite instance, SIComposite previousPersistedInstance, Integer inclusionActor, SInstance field) { SIList<SIComposite> listInstance = instance.getFieldList(field.getType().getNameSimple(), SIComposite.class); SIList<SIComposite> previousListInstance = previousPersistedInstance .getFieldList(field.getType().getNameSimple(), SIComposite.class); for (SIComposite item : listInstance.getChildren()) { if (FormKey.containsKey(item)) updateInternal(instance, locate(FormKey.fromInstance(item), previousListInstance), inclusionActor); else insertInternal(instance, inclusionActor); } for (SIComposite item : detectIntancesToDelete(field.getType(), instance, previousPersistedInstance)) { deleteInternal(item.getType(), FormKey.fromInstance(item)); } }
public void addObrasProcesso(){ final STypeList<STypeObra, SIComposite> obrasProcesso = this.addFieldListOf(FIELD_OBRAS_PROCESSO, STypeObra.class); obrasProcesso.asAtr().itemLabel("Obra"); obrasProcesso.withView(new SViewListByMasterDetail(), view -> view.col(obrasProcesso.getElementsType().getFieldValorSolicitado()), view -> view.col(obrasProcesso.getElementsType().getFieldValorContratado()), view -> view.col("Valor Empenhado", instancia -> { final BigDecimal valorEmpenhado = ((SIComposite)instancia).getFieldList(STypeObra.FIELD_VALORES_EMPENHADOS, SIComposite.class) .stream().map(instanciaComposta -> (BigDecimal) Value.of(instanciaComposta, STypeValorEmpenhadoObra.FIELD_VALOR_EMPENHADO)) .filter(valor -> valor != null) .reduce(BigDecimal.ZERO, BigDecimal::add); return ConversorToolkit.printNumber(valorEmpenhado, 2); }), view -> view.col(getFieldObrasProcesso().getElementsType().getFieldNumContrato())); }
public void addObrasProcesso(){ final STypeList<STypeObra, SIComposite> obrasProcesso = this.addFieldListOf(FIELD_OBRAS_PROCESSO, STypeObra.class); obrasProcesso.asAtr().itemLabel("Obra"); obrasProcesso.withView(new SViewListByMasterDetail(), view -> view.col(obrasProcesso.getElementsType().getFieldValorSolicitado()), view -> view.col(obrasProcesso.getElementsType().getFieldValorContratado()), view -> view.col("Valor Empenhado", instance -> { final BigDecimal valorEmpenhado = ((SIComposite)instance).getFieldList(STypeObra.FIELD_VALORES_EMPENHADOS, SIComposite.class) .stream().map(compositeInstance -> (BigDecimal) Value.of(compositeInstance, STypeValorEmpenhadoObra.FIELD_VALOR_EMPENHADO)) .filter(valor -> valor != null) .reduce(BigDecimal.ZERO, BigDecimal::add); return ConversorToolkit.printNumber(valorEmpenhado, 2); }), view -> view.col(getFieldObrasProcesso().getElementsType().getFieldNumContrato())); }