private List buildRows()

in service/src/main/java/org/apache/fineract/cn/reporting/service/internal/specification/DepositListReportSpecification.java [174:293]


    private List<Row> buildRows(final ReportRequest reportRequest, final List<?> customerResultList) {
        final ArrayList<Row> rows = new ArrayList<>();

        customerResultList.forEach(result -> {
            final Row row = new Row();
            row.setValues(new ArrayList<>());

            final String customerIdentifier;

            if (result instanceof Object[]) {
                final Object[] resultValues = (Object[]) result;

                customerIdentifier = resultValues[0].toString();

                for (final Object resultValue : resultValues) {
                    final Value value = new Value();
                    if (resultValue != null) {
                        value.setValues(new String[]{resultValue.toString()});
                    } else {
                        value.setValues(new String[]{});
                    }

                    row.getValues().add(value);
                }
            } else {
                customerIdentifier = result.toString();

                final Value value = new Value();
                value.setValues(new String[]{result.toString()});
                row.getValues().add(value);
            }

            final Query accountQuery = this.entityManager.createNativeQuery(this.buildDepositAccountQuery(reportRequest, customerIdentifier));
            final List<?> accountResultList = accountQuery.getResultList();

            final ArrayList<String> products = new ArrayList<>();
            final ArrayList<String> depositAccountNumber = new ArrayList<>();
            final ArrayList<String> depositType = new ArrayList<>();
            final ArrayList<String> status = new ArrayList<>();
            final ArrayList<String> createdBy = new ArrayList<>();
            final ArrayList<String> dateCreated = new ArrayList<>();

            accountResultList.forEach(accountResult -> {

                final String productIdentifier;
                if (accountResult instanceof Object[]) {
                    final Object[] accountResultValues = (Object[]) accountResult;

                    productIdentifier = accountResultValues[0].toString();

                    final Query depositProductQuery = this.entityManager.createNativeQuery(this.buildDepositProductQuery(reportRequest, productIdentifier));
                    final List<?> depositProductResultList = depositProductQuery.getResultList();

                    depositProductResultList.forEach(product -> {
                        final Object[] productResultValues = (Object[]) product;

                        for (int i = 0; i < productResultValues.length; i++) {

                            if (i == 0 && productResultValues[0] != null) {
                                products.add(productResultValues[0].toString());
                            }

                            if (i == 1 && productResultValues[1] != null) {
                                depositType.add(productResultValues[1].toString());
                            }

                        }
                    });


                    for (int i = 1; i < accountResultValues.length ; i++) {
                        if (i == 1 && accountResultValues[1] != null){
                            depositAccountNumber.add(accountResultValues[1].toString());
                        }

                        if (i == 2  && accountResultValues[2] != null){
                            status.add(accountResultValues[2].toString());
                        }

                        if (i == 3 && accountResultValues[3] != null){
                            createdBy.add(accountResultValues[3].toString());
                        }

                        if (i == 4 && accountResultValues[4] != null){
                            dateCreated.add(accountResultValues[4].toString());
                        }

                    }
                }
            });

            final Value productValue = new Value();
            productValue.setValues(products.toArray(new String[products.size()]));
            row.getValues().add(productValue);

            final Value depositTypeValue = new Value();
            depositTypeValue.setValues(depositType.toArray(new String[depositAccountNumber.size()]));
            row.getValues().add(depositTypeValue);

            final Value depositAccountNumberValue = new Value();
            depositAccountNumberValue.setValues(depositAccountNumber.toArray(new String[depositType.size()]));
            row.getValues().add(depositAccountNumberValue);

            final Value statusValue = new Value();
            statusValue.setValues(status.toArray(new String[status.size()]));
            row.getValues().add(statusValue);

            final Value createdByValue = new Value();
            createdByValue.setValues(createdBy.toArray(new String[createdBy.size()]));
            row.getValues().add(createdByValue);

            final Value dateCreatedValue = new Value();
            dateCreatedValue.setValues(dateCreated.toArray(new String[dateCreated.size()]));
            row.getValues().add(dateCreatedValue);

            rows.add(row);
        });

        return rows;
    }