blob: 86a91f9c780565cadedbb0f0725b3ee707c570c6 [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2018 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*/
package org.eclipse.osbp.xtext.datamart.common;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.osbp.preferences.EnumDatabaseVendor;
import org.eclipse.osbp.preferences.ProductConfiguration;
import org.eclipse.osbp.runtime.common.event.IDualData;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter;
import org.eclipse.osbp.ui.api.datamart.DatamartFilter.FilterType;
import org.eclipse.osbp.ui.api.datamart.IDataMart;
import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
/**
* The Class ADatamart.
*
* @param <C> the generic type
*/
@SuppressWarnings("all")
public abstract class ADatamart<C> implements IDataMart {
/**
* Connect.
*
* @return the c
*/
public abstract C connect();
/**
* Gets the axis map.
*
* @return the axis map
*/
public abstract Map<Integer,ArrayList<String>> getAxisMap();
/* (non-Javadoc)
* @see org.eclipse.osbp.ui.api.datamart.IDataMart#getIdMap()
*/
@Override
public abstract Map<String, EType> getIdMap();
/* (non-Javadoc)
* @see org.eclipse.osbp.ui.api.datamart.IDataMart#getAliasMap()
*/
@Override
public abstract Map<String, String> getAliasMap();
/* (non-Javadoc)
* @see org.eclipse.osbp.ui.api.datamart.IDataMart#getTypesMap()
*/
@Override
public abstract Map<String, EType> getTypesMap();
/* (non-Javadoc)
* @see org.eclipse.osbp.ui.api.datamart.IDataMart#getTypesProp()
*/
@Override
public abstract Map<String, String> getTypesProp();
/* (non-Javadoc)
* @see org.eclipse.osbp.ui.api.datamart.IDataMart#getHiddenMap()
*/
@Override
public abstract Map<String, AttributeVisibility> getHiddenMap();
/**
* Disconnect.
*
* @return returns results from datamart. If filler text is enabled, the result will be generated via filler text.
* @see {@link #enableFillerText(boolean)}
*/
public abstract void disconnect();
/** The db vendor. */
protected EnumDatabaseVendor dbVendor = null;
/** The filter map. */
private ArrayList<DatamartFilter> filterMap = null;
/**
* @return the map with all filters, which has to be initialized once
*/
@Override
public ArrayList<DatamartFilter> getFilters() {
if (filterMap == null) {
if(getPersistenceUnit() != null) {
String jndiName = ProductConfiguration.getPersistenceUnitJndiName(getPersistenceUnit());
dbVendor = ProductConfiguration.getDataSource(jndiName).getDatabaseVendor();
}
filterMap = initializeFilterMap();
}
return filterMap;
}
/**
* Gets the vendor specific sql.
*
* @param filter the filter
* @return the vendor sql
*/
protected String getVendorSql(DatamartFilter filter) {
if(dbVendor != null) {
return dbVendor.applySqlSpecifications(filter.getSql());
}
return filter.getSql();
}
/**
* Calls the vendor specific 'to date' sql method.
*
* @param date the date
* @return the vendor 'to date' sql method prefix
*/
protected String vendorConvertToDateSQL( java.util.Date date ) {
return vendorConvertToDateSQL(new Date(date.getTime()));
}
/**
* Calls the vendor specific 'to date' sql method.
*
* @param date the date
* @return the vendor 'to date' sql method prefix
*/
protected String vendorConvertToDateSQL( Date date ) {
if(dbVendor != null) {
return dbVendor.convertToDateSQL(date);
}
return "to_date('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
}
/**
* Gets the vendor specific 'to date' sql method prefix.
*
* @return the vendor 'to date' sql method prefix
*/
@Deprecated
protected String getVendorToDateSQLMethod() {
if(dbVendor != null) {
return dbVendor.getToDateSQLMethod();
}
return "to_date";
}
/**
* Calls the vendor specific 'to timestamp' sql method.
*
* @param date the date
* @return the vendor 'to date' sql method prefix
*/
protected String vendorConvertToTimestampSQL( Timestamp date ) {
if(dbVendor != null) {
return dbVendor.convertToTimestampSQL(date);
}
return "to_timestamp('"+date.toString().replace(".0","")+"','YYYY-MM-DD HH24:MI:SS')";
}
/**
* Gets the vendor specific 'to timestamp' sql method prefix.
*
* @return the vendor 'to timestamp' sql method prefix
*/
@Deprecated
protected String getVendorToTimestampSQLMethod() {
if(dbVendor != null) {
return dbVendor.getToTimestampSQLMethod();
}
return "to_timestamp";
}
/**
* Gets the filters count.
*
* @return count of filters
*/
protected int getFiltersCount() {
return getFilters().size();
}
/**
* Gets the persistence unit.
*
* @return the persistence unit used
*/
abstract protected String getPersistenceUnit();
/**
* Initialize filter map.
*
* @return the initialized filter map
*/
abstract protected ArrayList<DatamartFilter> initializeFilterMap();
/**
* Compute conditions from selected data according to the filter type.
*/
@Override
public void computeConditions() {
ArrayList<DatamartFilter> filters = getFilters();
if (filters != null) {
DatamartFilter firstFilter = null;
List<List<String>> filterGroup = new ArrayList<>();
for (DatamartFilter filter : filters) {
filter.setCondition(null);
switch (filter.getType()) {
case BY_ID:
if(!filter.getSql().isEmpty()) {
filter.setCondition(filter.getName()+"="+filter.getSql());
}
break;
case SINGLE:
case SINGLESLICER:
case SINGLEHIERARCHY:
case SINGLEHIERARCHYCHILDREN:
if(!filter.getSelectedData().isEmpty()) {
filter.setCondition(filter.getSelectedData().get(0).getDatabaseSelectionValue());
if(filter.getType()==FilterType.SINGLEHIERARCHYCHILDREN) {
filter.setCondition(filter.getCondition()+".Children");
}
} else { // failsafe - but only if filter is optional
filter.setCondition("'*'");
}
break;
case BETWEEN:
case BETWEEN_DATE:
if(filter.getBetweenInputComponent() != null) {
if ((!filter.getBetweenInputComponent().getFrom().isEmpty()) && (!filter.getBetweenInputComponent().getUntil().isEmpty())){
if (filter.getBetweenInputComponent() instanceof DatamartBetweenDate) {
String betweenFrom = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getFromInput().getValue());
String betweenUntil = vendorConvertToDateSQL(((DatamartBetweenDate)filter.getBetweenInputComponent()).getUntilInput().getValue());
filter.setCondition(filter.getName() + " BETWEEN " + betweenFrom + " AND " + betweenUntil);
} else {
filter.setCondition(filter.getName() + " BETWEEN '" + filter.getBetweenInputComponent().getFrom() + "' AND '" + filter.getBetweenInputComponent().getUntil() + "'");
}
} else {
filter.setCondition("1=1");
}
} else { // failsafe - but only if filter is optional
filter.setCondition("1=1");
}
break;
case EXCEPT:
case MULTIPLE:
case MULTIPLEHIERARCHY:
case MULTIPLEHIERARCHYCHILDREN:
String selection = "";
for(IDualData item : filter.getSelectedData()) {
if (item != null) {
if (!selection.isEmpty()) {
selection += ",";
}
selection += item.getDatabaseSelectionValue();
if(filter.getType()==FilterType.MULTIPLEHIERARCHYCHILDREN) {
selection += ".Children";
}
}
}
if(!filter.getSelectedData().isEmpty()) {
if(filter.getType()==FilterType.MULTIPLEHIERARCHYCHILDREN) {
filter.setCondition("{"+selection+"}");
} else {
filter.setCondition(selection);
}
} else if(filter.getType() == FilterType.EXCEPT) {
filter.setCondition("");
} else {
filter.setCondition("'*'");
}
break;
case MULTIPLESLICER:
// all multiple slicer filters are accumulated to the first filter multiple slicer filter
List<String> myList = new ArrayList<>();
for (IDualData item : filter.getSelectedData()) {
if (item != null) {
myList.add(item.getDatabaseSelectionValue());
}
}
filterGroup.add(myList);
if (firstFilter == null) {
firstFilter = filter;
} else {
filter.setCondition("<empty>");
}
break;
}
}
if(firstFilter != null) {
// calculate every permutation of selection as slices must be created
List<List<String>> permutations = new ArrayList<>();
int numEntries = 1;
for (List<String> list : filterGroup) {
numEntries *= list.size();
}
for (int i = 0; i < numEntries; i++) {
permutations.add(new ArrayList<String>());
}
for (List<String> itemList : filterGroup) {
Iterator<String> iterator = itemList.iterator();
if (iterator.hasNext()) {
for (List<String> entry : permutations) {
entry.add(iterator.next());
if (!iterator.hasNext()) {
iterator = itemList.iterator();
}
}
}
}
String set = "";
boolean firstSet = true;
for (List<String> permutation : permutations) {
boolean firstTuple = true;
String tuple = "";
for (String item : permutation) {
if (firstTuple) {
firstTuple = false;
} else {
tuple += ",";
}
tuple += item;
}
if (firstSet) {
firstSet = false;
} else {
set += ",";
}
set += "(" + tuple + ")";
}
firstFilter.setCondition("{" + set + "}");
}
}
}
}