/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.operation;
import net.codjo.model.Table;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* Utilitaire pour le decoupage du champ SELECT_CRITERIA en 2 parties l'une concernant le critere sur la table
* BO_PORTFOLIO et l'autre sur la table a updater.
*/
public class SqlWhereClauseUtil {
private static String[] whereClauseOperandes = new String[10];
private static String[] whereClauseFields = new String[10];
private List<String> clauseList = new ArrayList<String>(6);
private String[] operateurs = new String[]{"<=", ">=", "<", ">", "=", "<>", "in ("};
// private String[] operateurs = new String[]{ "=", "<>", "in ("};
SqlWhereClauseUtil() {
}
SqlWhereClauseUtil(String whereClause) {
init();
getWhereClauseFields(whereClause);
}
private String[] getWhereClauseOperandes() {
return whereClauseOperandes;
}
public void init() {
clauseList.clear();
clauseList.add(0, "");
clauseList.add(1, "");
purge();
}
public void addPtfRestrictionList(String str) {
clauseList.set(0, str);
}
public String getSelectTerm() {
return clauseList.get(0);
}
public String getSelectWhereClause() {
return (getSelectTerm() == null || "".equals(getSelectTerm())) ? ""
: " where "
+ getSelectTerm();
}
public String getUpdateWhereClause() {
return (getUpdateTerm() == null || "".equals(getUpdateTerm())) ? ""
: " where "
+ getUpdateTerm();
}
public String getUpdateTerm() {
return clauseList.get(1);
}
public void dealWithPortfolioGroup(String portfolioGroupName, String tableName) {
clauseList.set(0, "BO_PORTFOLIO.PORTFOLIO_GROUP ='" + portfolioGroupName + "'");
clauseList.set(1, tableName + ".PORTFOLIO_CODE = BO_PORTFOLIO.PORTFOLIO_CODE");
}
public void buildCriteria(String criteriaTemp, Table tableOfQuery) {
getWhereClauseFields(criteriaTemp);
String[] tempWhereClauseOperandes = getWhereClauseOperandes();
String[] tempWhereClauseFields = getWhereClauseFields();
for (int i = 0; i < tempWhereClauseFields.length; i++) {
if (!("".equals(tempWhereClauseOperandes[i]))) {
if (tableOfQuery.containsColumn(tempWhereClauseFields[i])) {
addToClauseList(i, 1, tempWhereClauseOperandes);
}
else {
addToClauseList(i, 0, tempWhereClauseOperandes);
}
}
}
}
private void addToClauseList(int index, int clauseIndex, String[] tempWhereClauseOperandes) {
clauseList.set(clauseIndex,
clauseList.get(clauseIndex)
+ ("".equals(tempWhereClauseOperandes[index]) ? ""
: " and "
+ tempWhereClauseOperandes[index]));
}
String fillWhereClauseWithPeriod(String initialWhereClause, String period,
String previousPeriod, String company) {
if (initialWhereClause != null) {
String clause = initialWhereClause;
int idx = clause.indexOf("$CURRENT_PERIOD$");
if (idx >= 0) {
StringBuilder criteria = new StringBuilder(clause);
criteria.replace(idx, idx + 16, "'" + period + "'");
clause = criteria.toString();
}
int idxprev = clause.indexOf("$PREVIOUS_PERIOD$");
if (idxprev >= 0) {
StringBuilder criteriaPrev = new StringBuilder(clause);
criteriaPrev.replace(idxprev, idxprev + 17, "'" + previousPeriod + "'");
clause = criteriaPrev.toString();
}
int idxCompany = clause.indexOf("$COMPANY$");
if (idxCompany >= 0) {
StringBuilder criteriaPrev = new StringBuilder(clause);
criteriaPrev.replace(idxCompany, idxCompany + 9,
"'" + company + "'");
clause = criteriaPrev.toString();
}
return clause;
}
return initialWhereClause;
}
public void dealWithPeriod(String period) {
String wCltemp = clauseList.get(1);
if ("".equals(wCltemp)) {
clauseList.set(1, "PERIOD='" + period + "'");
}
else {
clauseList.set(1, wCltemp + " and PERIOD='" + period + "'");
}
}
public void dealWithSourceSystem(String sourceSystem, String tableName) {
String wCltemp = clauseList.get(1);
clauseList.set(1,
("".equals(wCltemp) ? " " : clauseList.get(1)) + " and " + tableName
+ ".SOURCE_SYSTEM = " + "'" + sourceSystem + "'");
}
public String[] getWhereClauseOperandes(String whereClauseToCut) {
int pos = 0;
// Purge des tableaux
purge();
whereClauseToCut = whereClauseToCut.replaceAll("and ", ";");
for (StringTokenizer tokenizer =
new StringTokenizer(whereClauseToCut, ";", false);
tokenizer.hasMoreTokens();) {
String str = tokenizer.nextToken();
whereClauseOperandes[pos++] = str.trim();
}
return whereClauseOperandes;
}
private void purge() {
// Purge des tableaux
for (int i = 0; i < whereClauseOperandes.length; i++) {
whereClauseOperandes[i] = "";
whereClauseFields[i] = "";
}
}
String getLeftElementOfOperande(String operande) {
String str;
int pos = -1;
for (String operateur : operateurs) {
if (pos == -1) {
pos = operande.indexOf(operateur);
}
}
str = operande.substring(0, (pos == -1) ? 0 : pos);
return str.trim();
}
String getFieldOfElement(String element) {
String str = element;
int posDot = element.indexOf(".");
int posOperateur = -1;
for (String operateur : operateurs) {
if (posOperateur == -1) {
posOperateur = element.indexOf(operateur);
}
}
if (posOperateur == -1) {
posOperateur = element.length();
}
if (posDot != -1 || posOperateur != -1) {
str = element.substring(posDot + 1, posOperateur);
}
while (str.contains("(")) {
int posParenthesis = str.indexOf("(");
if (posParenthesis != -1) {
str = str.substring(posParenthesis + 1);
}
}
return str.trim();
}
private String[] getWhereClauseFields() {
for (int i = 0; i < whereClauseOperandes.length; i++) {
String whereClauseOperande = whereClauseOperandes[i];
whereClauseFields[i] =
getFieldOfElement(getLeftElementOfOperande(whereClauseOperande));
}
return whereClauseFields;
}
String[] getWhereClauseFields(String whereClause) {
purge();
getWhereClauseOperandes(whereClause);
getWhereClauseFields();
return whereClauseFields;
}
public void fill(String period, String previousPeriod, String company) {
clauseList.set(0,
fillWhereClauseWithPeriod(getSelectTerm(), period, previousPeriod, company));
clauseList.set(1,
fillWhereClauseWithPeriod(getUpdateTerm(), period, previousPeriod, company));
}
}