/*
|
* 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<List<Map<String, Object>>> {
|
|
private final List<LinkedHashMap<String, Object>> sourceData;
|
private final TableDefinition tableDefinition;
|
private final List<Map<String, Object>> cachedData = new ArrayList<>();
|
private final int THRESHOLD = 5000;
|
|
public FdxParsedDataAction(List<LinkedHashMap<String, Object>> sourceData, TableDefinition tableDefinition) {
|
this.sourceData = sourceData;
|
this.tableDefinition = tableDefinition;
|
}
|
|
@Override
|
protected List<Map<String, Object>> 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<String, Object> 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<FdxParsedDataAction> createSubtasks() {
|
List<FdxParsedDataAction> 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;
|
}
|
|
}
|