/* * 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.fdxcommons.tools.utils; import com.megatim.fdxcommons.model.integration.TableDefinition; import com.megatim.fdxcommons.tools.database.exceptions.BadDataValueException; import com.megatim.fdxcommons.tools.database.exceptions.ColumnNotFoundException; import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError; import com.megatim.fdxcommons.tools.database.queries.metadata.FdxParsedDataRow; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author ASUS */ public class FdxParsedDataAction extends RecursiveTask>> { private final List> sourceData; private final TableDefinition tableDefinition; private final List> cachedData = new ArrayList<>(); private final int THRESHOLD = 5000; public FdxParsedDataAction(List> sourceData, TableDefinition tableDefinition) { this.sourceData = sourceData; this.tableDefinition = tableDefinition; } @Override protected List> compute() { if (sourceData.size() > THRESHOLD) { ForkJoinTask .invokeAll(createSubtasks()) .stream() .map(FdxParsedDataAction::join) .forEach(l -> cachedData.addAll(l)); return cachedData; } else { if (cachedData.isEmpty()) { for (Map data : sourceData) { try { cachedData.add(new FdxParsedDataRow(data, tableDefinition).dataRow()); } catch (ColumnNotFoundException | BadDataValueException | LocalDateTimeValueParseError ex) { Logger.getLogger(FdxParsedDataAction.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); throw new RuntimeException(ex); } } } return cachedData; } } private List createSubtasks() { List subtasks = new ArrayList<>(); int size = sourceData.size() / 4; int remainder = sourceData.size() % 4; subtasks.add(new FdxParsedDataAction(sourceData.subList(0, size), tableDefinition)); subtasks.add(new FdxParsedDataAction(sourceData.subList(size, size * 2), tableDefinition)); subtasks.add(new FdxParsedDataAction(sourceData.subList(size * 2, size * 3), tableDefinition)); subtasks.add(new FdxParsedDataAction(sourceData.subList(size * 3, size * 4 + remainder), tableDefinition)); return subtasks; } }