/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.apifdxweb.dao.impl.tmp; import com.megatim.apifdxweb.dao.ifaces.tmp.TypeFichierDataTmpDAO; import com.megatim.apifdxweb.model.tmp.TypeFichierDataTmp; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Optional; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.Tuple; /** * * @author ASUS */ @Stateless public class TypeFichierDataTmpDAOImpl implements TypeFichierDataTmpDAO { @PersistenceContext(unitName = "fdxPU") protected EntityManager em; @Override public Class getManagedEntityClass() { return TypeFichierDataTmp.class; } @Override public EntityManager getEntityManager() { return em; } @Override public TypeFichierDataTmp getById(Long id) { Query query = em.createQuery("SELECT t FROM TypeFichierDataTmp t WHERE t.id = :id"); query.setParameter("id", id); Optional optionalTypeFichierDataTmp = query.getResultList().stream().findFirst(); return optionalTypeFichierDataTmp.isPresent() ? optionalTypeFichierDataTmp.get() : null; } @Override public void deleteByToken(String token) { Query query = em.createQuery("DELETE TypeFichierDataTmp t WHERE t.token = :token"); query.setParameter("token", token); query.executeUpdate(); } @Override public List getByToken(String token) { // WITH NumberedValues AS ( // SELECT // colonne, // datum, // ROW_NUMBER() OVER (PARTITION BY colonne ORDER BY numeroligne) AS row_num // FROM // typefichierdatatmp // where token='dd6ed96a-0bfc-38ce-bdf4-5d9716325f4a' //) //SELECT // MAX(CASE WHEN colonne = 'niu' THEN datum END) AS NIU, // MAX(CASE WHEN colonne = 'codecentre' THEN datum END) AS codecentre, // MAX(CASE WHEN colonne = 'codecm' THEN datum END) AS codecm, // MAX(CASE WHEN colonne = 'regime' THEN datum END) AS regime, // MAX(CASE WHEN colonne = 'registre_commerce' THEN datum END) AS registre_commerce, // MAX(CASE WHEN colonne = 'raisoc' THEN datum END) AS raisoc, // MAX(CASE WHEN colonne = 'nom_etablisement' THEN datum END) AS nom_etablisement // //FROM // NumberedValues //GROUP BY // row_num //ORDER BY // row_num; Query query = em.createQuery("SELECT t FROM TypeFichierDataTmp t WHERE t.token = :token"); query.setParameter("token", token); return query.getResultList(); } @Override public List getByTokenAndByNumeroLigne(String token, int minNumeroLigne, int maxNumeroLigne) { Query query = em.createQuery("SELECT t FROM TypeFichierDataTmp t WHERE t.token = :token AND t.numeroLigne >= : minNumeroLigne AND t.numeroLigne < :maxNumeroLigne"); query.setParameter("token", token); query.setParameter("minNumeroLigne", minNumeroLigne); query.setParameter("maxNumeroLigne", maxNumeroLigne); return query.getResultList(); } @Override public boolean hasBatchAlreadyBeenReceived(String token, int batchNumber) { Query query = em.createQuery("SELECT t FROM TypeFichierDataTmp t WHERE t.token = :token and t.batchNumber = :batchNumber"); query.setParameter("token", token); query.setParameter("batchNumber", batchNumber); return query.getResultList().stream().findFirst().isPresent(); } @Override public List> getByStructuredLines(String token, List columnsDef) { Collections.sort(columnsDef, (ColumnDefinition c1, ColumnDefinition c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); List> results = new ArrayList<>(); String query = constructQuery(token, columnsDef); List tuples = em.createNativeQuery(query, Tuple.class).getResultList(); tuples.stream().forEach(t -> { LinkedHashMap map = new LinkedHashMap<>(); for (int i = 0; i < columnsDef.size(); i++) { map.put(columnsDef.get(i).getName(), t.get(i, String.class)); } results.add(map); }); return results; } private String constructQuery(String token, List columnsDef) { StringBuilder builder = new StringBuilder("WITH Lines AS (" + " SELECT colonne, datum, ROW_NUMBER() OVER (PARTITION BY colonne ORDER BY numeroligne) AS row_num" + " FROM typefichierdatatmp" + " WHERE token='" + token + "'" + ") SELECT "); for (ColumnDefinition c : columnsDef) { builder.append(" MAX(CASE WHEN colonne = '").append(c.getName()).append("' THEN datum END) AS ").append(c.getName()).append(","); } builder.replace(builder.length() - 1, builder.length(), ""); builder.append(" FROM Lines GROUP BY row_num ORDER BY row_num"); return builder.toString(); } }