blob: 06940aae87bb626bf3bceae54ab2a4957d1b995f [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2020 The University of York.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*********************************************************************/
package org.eclipse.epsilon.pinset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.antlr.runtime.ANTLRInputStream;
import org.antlr.runtime.Lexer;
import org.antlr.runtime.TokenStream;
import org.eclipse.epsilon.common.module.IModule;
import org.eclipse.epsilon.common.module.ModuleElement;
import org.eclipse.epsilon.common.parse.AST;
import org.eclipse.epsilon.common.parse.EpsilonParser;
import org.eclipse.epsilon.common.util.AstUtil;
import org.eclipse.epsilon.eol.dom.ExecutableBlock;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.erl.ErlModule;
import org.eclipse.epsilon.pinset.columnGenerators.Column;
import org.eclipse.epsilon.pinset.columnGenerators.Grid;
import org.eclipse.epsilon.pinset.columnGenerators.NestedFrom;
import org.eclipse.epsilon.pinset.columnGenerators.Properties;
import org.eclipse.epsilon.pinset.columnGenerators.Reference;
import org.eclipse.epsilon.pinset.output.Persistence;
import org.eclipse.epsilon.pinset.parse.PinsetLexer;
import org.eclipse.epsilon.pinset.parse.PinsetParser;
/**
* PinsetModule.
*
* @author Alfonso de la Vega
* @since 2.1
*/
public class PinsetModule extends ErlModule {
public static final String SILENT_ANNOTATION = "silent";
public static final String NORMALIZE_ANNOTATION = "normalize";
public static final String FILL_NULLS_ANNOTATION = "fillNulls";
public static final String FILL_NULLS_MEAN = "mean";
public static final String FILL_NULLS_MODE = "mode";
protected List<DatasetRule> datasetRules = new ArrayList<>();
protected String outputFolder = "";
protected String separator = ",";
protected String extension = ".csv";
protected String prefix = "";
protected boolean silent = false;
protected boolean persistDatasets = true;
@Override
public ModuleElement adapt(AST cst, ModuleElement parentAst) {
switch (cst.getType()) {
case PinsetParser.DATASET:
return new DatasetRule();
case PinsetParser.GUARD:
return new ExecutableBlock<>(Boolean.class);
case PinsetParser.COLUMN:
return new Column();
case PinsetParser.PROPERTIES:
return new Properties();
case PinsetParser.REFERENCE:
return new Reference();
case PinsetParser.GRID:
return new Grid();
case PinsetParser.NESTEDFROM:
return new NestedFrom();
}
return super.adapt(cst, parentAst);
}
@Override
public void build(AST cst, IModule module) {
super.build(cst, module);
for (AST processRuleAst : AstUtil.getChildren(cst, PinsetParser.DATASET)) {
datasetRules.add((DatasetRule) module.createAst(processRuleAst, this));
}
}
@Override
public Lexer createLexer(ANTLRInputStream inputStream) {
return new PinsetLexer(inputStream);
}
@Override
public EpsilonParser createParser(TokenStream tokenStream) {
return new PinsetParser(tokenStream);
}
@Override
public String getMainRule() {
return "pinsetModule";
}
@Override
public HashMap<String, Class<?>> getImportConfiguration() {
HashMap<String, Class<?>> importConfiguration = super.getImportConfiguration();
importConfiguration.put("pinset", PinsetModule.class);
return importConfiguration;
}
@Override
protected Object processRules() throws EolRuntimeException {
for (DatasetRule datasetRule : datasetRules) {
datasetRule.execute(context);
if (persistDatasets) {
Persistence.persist(datasetRule.getDataset(), getFilePath(datasetRule), getSeparator());
datasetRule.dispose();
}
}
return null;
}
public void preExecution() throws EolRuntimeException {
execute(getPre(), getContext());
}
public List<DatasetRule> getDatasetRules() {
return datasetRules;
}
public DatasetRule getDatasetRule(String ruleName) {
for (DatasetRule rule : datasetRules) {
if (rule.getName().equalsIgnoreCase(ruleName)) {
return rule;
}
}
return null;
}
public void setOutputFolder(String attribute) {
outputFolder = attribute;
}
public String getOutputFolder() {
if (outputFolder.equals("") && getSourceFile() != null) {
outputFolder = getSourceFile().getParent();
}
return outputFolder;
}
public String getFilePath(DatasetRule rule) {
return String.format("%s/%s",
getOutputFolder(), getFileName(rule));
}
public String getFileName(DatasetRule rule) {
return String.format("%s%s%s",
getPrefix(), rule.getName(), getExtension());
}
public String getSeparator() {
return separator;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSeparator(String separator) {
this.separator = separator;
}
public String getExtension() {
return extension;
}
public void setExtension(String extension) {
this.extension = extension;
}
public boolean isSilent() {
return silent;
}
public void setSilent(boolean silent) {
this.silent = silent;
}
/**
* Set whether the datasets must be persisted into output files or not
*/
public void persistDatasets(boolean persistDatasets) {
this.persistDatasets = persistDatasets;
}
}