Column Calculators
This page provides a description of how we can add a new column calculator. It features an example in which we populate a new field to SaCvaVegaRiskWeight store. The techniques employed are generic examples that can be extended, adapted and repeated for any use case that we need. In all cases, we make minimal changes to the Accelerator Reference Implementation.
Step 1 - Define Customisations to Data Store via Datastore Helper
The first thing we want to do is to add a field that we will populate with our column calculator, in this case we will be exploring a few examples.
Define data store customizations inside of loadcustomisations()
method inside DatastoreCustomisations
class located
/cvarc-starter/src/main/java/com/activeviam/cvarc/starter/cfg/impl/DatastoreCustomisations.java
See more customizations achievable with Datastore Helper.
package com.activeviam.cvarc.starter.cfg.impl;
import com.activeviam.tools.datastore.IDatastoreCustomisations;
import com.activeviam.tools.datastore.impl.CustomField;
import com.activeviam.tools.datastore.impl.DatastoreHelper;
import com.qfs.literal.ILiteralType;
public class DatastoreCustomisations implements IDatastoreCustomisations {
/**
* Defines the transformations to be performed on the default Accelerator stores, using {@link DatastoreHelper}.
*/
@Override
public void loadCustomisations() {
//Define transformations here.
DatastoreHelper.appendField("SaCvaVegaRiskWeight", new CustomField("FileName", ILiteralType.STRING));
DatastoreHelper.appendField("SaCvaVegaRiskWeight", new CustomField("Math", ILiteralType.DOUBLE));
}
}
Step 2 - Define Column Calculator
We want to define the logic of our column calculator.
Bellow we have some examples of Column Calculators that we will define inside of
/cvarc-starter/src/main/java/com/activeviam/cvarc/starter/cfg/impl/
File Name Column Calculator
package com.activeviam.cvarc.starter.cfg.impl;
import com.qfs.msg.csv.ILineReader;
import com.qfs.msg.csv.translator.impl.AColumnCalculator;
public class FileNameColCal extends AColumnCalculator<ILineReader> {
public FileNameColCal(String columnName) {
super(columnName);
}
@Override
public Object compute(IColumnCalculationContext<ILineReader> context) {
final String filename = context.getContext().getCurrentFile().getName();
return filename;
}
}
Mathematical Operation Between Two Existing Columns Column Calculator
package com.activeviam.cvarc.starter.cfg.impl;
import com.qfs.msg.csv.ILineReader;
import com.qfs.msg.csv.translator.impl.AColumnCalculator;
public class MathColCal extends AColumnCalculator<ILineReader> {
public MathColCal(String columnName) {
super(columnName);
}
@Override
public Object compute(IColumnCalculationContext<ILineReader> context) {
final double RiskWeight = (double) context.getValue("RiskWeight");
final double ParameterC = (double) context.getValue("ParameterC");
return RiskWeight + ParameterC;
}
}
Step 3 - Include Column Calculator in Channel Factory
For our column calculator to be picked up we need to include it into our Channel Factory.
package com.activeviam.cvarc.starter.cfg.impl;
import com.activeviam.cvarc.sa.ref.cfg.impl.SaCsvSourceConfig;
import com.qfs.msg.IColumnCalculator;
import com.qfs.msg.csv.ILineReader;
import com.qfs.source.impl.CSVMessageChannelFactory;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class ExtendedSaCsvSourceConfig extends SaCsvSourceConfig {
@Override
public CSVMessageChannelFactory<Path> bulkLoadCsvMessageChannelFactory(String sourceName) {
final CSVMessageChannelFactory<Path> csvMessageChannelFactory = new CSVMessageChannelFactory<>(
bulkLoadCsvSource(sourceName), datastoreConfig.datastore());
final List<IColumnCalculator<ILineReader>> csvCalculatedColumns = new ArrayList<>();
csvCalculatedColumns.add(new FileNameColCal("FileName")); // Here we pass the desired field name we wish to populate
csvCalculatedColumns.add(new MathColCal("Math"));
csvMessageChannelFactory.setCalculatedColumns("SaCvaVegaRiskWeight", "SaCvaVegaRiskWeight", csvCalculatedColumns); // setCalculatedColumns takes params: Topic, Store, calculatedColumns
return csvMessageChannelFactory;
}
@Override
public CSVMessageChannelFactory<Path> incrLoadCsvMessageChannelFactory(String sourceName) {
final CSVMessageChannelFactory<Path> csvMessageChannelFactory = new CSVMessageChannelFactory<>(
incrLoadCsvSource(sourceName), datastoreConfig.datastore());
final List<IColumnCalculator<ILineReader>> csvCalculatedColumns = new ArrayList<>();
csvCalculatedColumns.add(new FileNameColCal("FileName")); // Here we pass the desired field name we wish to populate
csvCalculatedColumns.add(new MathColCal("Math"));
csvMessageChannelFactory.setCalculatedColumns("SaCvaVegaRiskWeight", "SaCvaVegaRiskWeight", csvCalculatedColumns); // setCalculatedColumns takes params: Topic, Store, calculatedColumns
return csvMessageChannelFactory;
}
}
Step 4 - Application Config
Replace SaCsvSourceConfig
with ExtendedSaCsvSourceConfig
so that our changes can be picked up in ApplicationConfig located in
cvarc-starter/src/main/java/com/activeviam/cvarc/starter/cfg/impl/ApplicationConfig.java
// data sourcing
SharedCsvSourceConfig.class,
SharedAzureCsvSourceConfig.class,
SharedAwsCsvSourceConfig.class,
SharedGoogleCsvSourceConfig.class,
// SaCsvSourceConfig.class, // here we comment out the original Source Config
ExtendedSaCsvSourceConfig.class, // and replace with our Extended Source Config
SaAzureCsvSourceConfig.class,
SaAwsCsvSourceConfig.class,
SaGoogleCsvSourceConfig.class,