All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.ird.observe.dto.report.ReportRequestExecutor Maven / Gradle / Ivy

package fr.ird.observe.dto.report;

/*-
 * #%L
 * ObServe Toolkit :: Dto
 * %%
 * Copyright (C) 2017 - 2021 Ultreia.io
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * .
 * #L%
 */

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

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

/**
 * To execute a request.
 * 

* Created on 21/09/2021. * * @author Tony Chemit - [email protected] * @since 5.0.44 */ public interface ReportRequestExecutor { Logger log = LogManager.getLogger(ReportRequestExecutor.class); Report populateVariables(Report report, Set tripIds); DataMatrix executeReport(Report report, Set tripId); List executeRequest(String request, Map params); void populateVariable(ReportVariable variable, Map vars); default DataMatrix executeReportRequest(ReportRequest request, Report report, Set dataId, ReportVariable repeatValues) { Map params = ReportRequest.extractParams(report, dataId); if (repeatValues == null) { return executeReportRequest(request, params); } DataMatrix result = new DataMatrix(); for (Object repeatValue : repeatValues.getValues()) { params.put(request.getRepeat().getVariableName(), repeatValue); DataMatrix tmp = executeReportRequest(request, params); switch (request.getRepeat().getLayout()) { case row: // on ajoute le résultat a droite de celui deja present tmp.setX(result.getX() + result.getWidth()); tmp.setY(result.getY()); break; case column: // on ajoute le résultat en dessous de celui deja present tmp.setX(result.getX()); tmp.setY(result.getY() + result.getHeight()); break; } result = DataMatrix.merge(result, tmp); } result.setX(request.getX()); result.setY(request.getY()); log.debug(String.format("Result location : %s", result.getLocation())); log.debug(String.format("Result data :\n%s", result.getClipboardContent(true, true, false, '\t'))); return result; } default DataMatrix executeReportRequest(ReportRequest reportRequest, Map params) { // création des paramètres : couples (key, value) log.debug(String.format("Request : %s", reportRequest.getRequest())); log.debug(String.format("Available params : %s", params.keySet())); log.debug(String.format("Params to use : %s", params)); // lancement de la requête List list = executeRequest(reportRequest.getRequest(), params); log.debug(String.format("Result size : %d", list.size())); // determination des dimensions du résultat DataMatrixDimension dimension = computeDimension(reportRequest, list); log.debug(String.format("Result dimension : %s", dimension)); // construction du résultat DataMatrix result = computeResult(reportRequest, dimension, list); log.debug(String.format("Result location : %s", result.getLocation())); log.debug(String.format("Result data :\n%s", result.getClipboardContent(true, true, false, '\t'))); return result; } @SuppressWarnings("unchecked") default void doPopulateRepeatVariables(Report report, Set tripId) { Map vars = ReportRequest.extractParams(report, tripId); for (@SuppressWarnings("rawtypes") ReportVariable variable : report.getRepeatVariables()) { String hql = variable.getRequest(); List universe = executeRequest(hql, vars); LinkedHashSet values = new LinkedHashSet<>(universe); variable.setValues(values); } } private DataMatrixDimension computeDimension(ReportRequest request, List list) { int height = 0; int width = 0; switch (request.getLayout()) { case row: // le count de result est le nombre de lignes height = list.size(); if (!list.isEmpty()) { Object o = list.get(0); if (o == null || !o.getClass().isArray()) { // une seule colonne width = 1; } else { width = ((Object[]) o).length; } } break; case column: // le count de result est le nombre de colonnes width = list.size(); if (!list.isEmpty()) { Object o = list.get(0); if (o == null || !o.getClass().isArray()) { // une seule ligne height = 1; } else { height = ((Object[]) o).length; } } break; } return new DataMatrixDimension(width, height); } private DataMatrix computeResult(ReportRequest request, DataMatrixDimension dimension, List list) { DataMatrix result = new DataMatrix(); result.setDimension(dimension); result.createData(); // le seul cas différent est le n-* (une ligne correspond à une colonne) int y = 0; int x = 0; switch (request.getLayout()) { case row: boolean uniqueColumn = result.getWidth() == 1; // les lignes du résultat sont les lignes du tableau for (Object row : list) { if (uniqueColumn) { // une seule colonne result.setValue(0, y, row); } else { x = 0; Object[] cells = (Object[]) row; for (Object cell : cells) { result.setValue(x++, y, cell); } } // on passage a la ligne suivante y++; } break; case column: // les lignes du résultat sont les colonnes du tableau boolean uniqueRow = result.getHeight() == 1; for (Object col : list) { if (uniqueRow) { // une seule ligne result.setValue(x, 0, col); } else { y = 0; Object[] cells = (Object[]) col; for (Object cell : cells) { result.setValue(x, y++, cell); } } // on passage a la colonne suivante x++; } break; } // on pousse la position du résultat result.setX(request.getX()); result.setY(request.getY()); return result; } }