Skip to content

Commit

Permalink
Fixed error with browse query
Browse files Browse the repository at this point in the history
  • Loading branch information
yamelsenih committed Nov 3, 2021
1 parent 99d8e05 commit f325e0b
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 120 deletions.
135 changes: 135 additions & 0 deletions src/main/java/org/spin/base/util/DictionaryUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,25 @@
*************************************************************************************/
package org.spin.base.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.adempiere.model.MBrowse;
import org.adempiere.model.MBrowseField;
import org.adempiere.model.MViewColumn;
import org.compiere.model.MColumn;
import org.compiere.model.MField;
import org.compiere.model.MTab;
import org.compiere.model.MTable;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.Language;
import org.spin.util.ASPUtil;

/**
* Class for handle records utils values
Expand Down Expand Up @@ -70,4 +82,127 @@ public static String getQueryWithReferencesFromTab(MTab tab) {
queryToAdd.append(joinsToAdd);
return queryToAdd.toString();
}

/**
* Get Context column names from context
* @param context
* @return
* @return List<String>
*/
public static List<String> getContextColumnNames(String context) {
if(context == null) {
return new ArrayList<String>();
}
String START = "\\@"; // A literal "(" character in regex
String END = "\\@"; // A literal ")" character in regex

// Captures the word(s) between the above two character(s)
String patternValue = START + "(#|$){0,1}(\\w+)" + END;

Pattern pattern = Pattern.compile(patternValue);
Matcher matcher = pattern.matcher(context);
Map<String, Boolean> columnNamesMap = new HashMap<String, Boolean>();
while(matcher.find()) {
columnNamesMap.put(matcher.group().replace("@", "").replace("@", ""), true);
}
return new ArrayList<String>(columnNamesMap.keySet());
}

/**
* Get SQL from View with a custom column as alias
* @param viewId
* @param columnNameForAlias
* @param trxName
* @return
*/
public static String getSQLFromBrowser(MBrowse browser) {
StringBuffer sql = new StringBuffer();
sql.append("SELECT DISTINCT ");
AtomicBoolean co = new AtomicBoolean(false);
ASPUtil.getInstance().getBrowseDisplayFields(browser.getAD_Browse_ID()).forEach(field -> {
if (co.get())
sql.append(",");
MViewColumn viewColumn = field.getAD_View_Column();
if (viewColumn.getColumnSQL() != null
&& viewColumn.getColumnSQL().length() > 0) {
sql.append(viewColumn.getColumnSQL());
co.set(true);
}
sql.append(" AS \"" + viewColumn.getColumnName() + "\"");
});
sql.append(" FROM ").append(browser.getAD_View().getFromClause());
return sql.toString();
}

/**
* Add references to original query from smart browser
* @param originalQuery
* @return
*/
public static String addQueryReferencesFromBrowser(MBrowse browser) {
String originalQuery = getSQLFromBrowser(browser);
int fromIndex = originalQuery.toUpperCase().indexOf(" FROM ");
StringBuffer queryToAdd = new StringBuffer(originalQuery.substring(0, fromIndex));
StringBuffer joinsToAdd = new StringBuffer(originalQuery.substring(fromIndex, originalQuery.length() - 1));
for (MBrowseField browseField : ASPUtil.getInstance().getBrowseDisplayFields(browser.getAD_Browse_ID())) {
int displayTypeId = browseField.getAD_Reference_ID();
if(DisplayType.isLookup(displayTypeId)) {
// Reference Value
int referenceValueId = browseField.getAD_Reference_Value_ID();
// Validation Code
String columnName = browseField.getAD_Element().getColumnName();
String tableName = browseField.getAD_View_Column().getAD_View_Definition().getTableAlias();
if(browseField.getAD_View_Column().getAD_Column_ID() > 0) {
columnName = browseField.getAD_View_Column().getAD_Column().getColumnName();
}
queryToAdd.append(", ");
ReferenceInfo referenceInfo = ReferenceUtil.getInstance(Env.getCtx()).getReferenceInfo(displayTypeId, referenceValueId, columnName, Env.getAD_Language(Env.getCtx()), tableName);
if(referenceInfo != null) {
queryToAdd.append(referenceInfo.getDisplayValue(browseField.getAD_View_Column().getColumnName()));
joinsToAdd.append(referenceInfo.getJoinValue(columnName, tableName));
}
}
}
queryToAdd.append(joinsToAdd);
return queryToAdd.toString();
}

/**
* Get Order By
* @param browser
* @return
*/
public static String getSQLOrderBy(MBrowse browser) {
StringBuilder sqlOrderBy = new StringBuilder();
for (MBrowseField field : ASPUtil.getInstance().getBrowseOrderByFields(browser.getAD_Browse_ID())) {
if (field.isOrderBy()) {
int orderByPosition = getOrderByPosition(browser, field);
if (orderByPosition <= 0)
continue;

if (sqlOrderBy.length() > 0) {
sqlOrderBy.append(",");
}
sqlOrderBy.append(orderByPosition);
}
}
return sqlOrderBy.length() > 0 ? sqlOrderBy.toString(): "";
}

/**
* Get Order By Postirion for SB
* @param BrowserField
* @return
*/
public static int getOrderByPosition(MBrowse browser, MBrowseField BrowserField) {
int colOffset = 1; // columns start with 1
int col = 0;
for (MBrowseField field : browser.getFields()) {
int sortBySqlNo = col + colOffset;
if (BrowserField.getAD_Browse_Field_ID() == field.getAD_Browse_Field_ID())
return sortBySqlNo;
col ++;
}
return -1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.adempiere.model.I_AD_Browse;
import org.adempiere.model.MBrowse;
import org.adempiere.model.MBrowseField;
import org.adempiere.model.MView;
import org.compiere.model.I_AD_Column;
import org.compiere.model.I_AD_Element;
import org.compiere.model.I_AD_Field;
Expand Down Expand Up @@ -69,12 +68,11 @@
import org.spin.base.util.ContextManager;
import org.spin.base.util.DictionaryUtil;
import org.spin.base.util.RecordUtil;
import org.spin.base.util.ReferenceInfo;
import org.spin.base.util.ReferenceUtil;
import org.spin.base.util.ValueUtil;
import org.spin.grpc.util.ApplicationRequest;
import org.spin.grpc.util.Browser;
import org.spin.grpc.util.ContextInfo;
import org.spin.grpc.util.DictionaryGrpc.DictionaryImplBase;
import org.spin.grpc.util.EntityRequest;
import org.spin.grpc.util.Field;
import org.spin.grpc.util.FieldCondition;
Expand All @@ -91,7 +89,6 @@
import org.spin.grpc.util.ValidationRule;
import org.spin.grpc.util.Window;
import org.spin.grpc.util.ZoomWindow;
import org.spin.grpc.util.DictionaryGrpc.DictionaryImplBase;
import org.spin.model.MADContextInfo;
import org.spin.model.MADFieldCondition;
import org.spin.model.MADFieldDefinition;
Expand Down Expand Up @@ -716,12 +713,10 @@ private Tab.Builder convertTab(Properties context, MTab tab, List<MTab> tabs, bo
.setIsView(table.isView())
.setTabLevel(tab.getTabLevel())
.setTableName(ValueUtil.validateNull(table.getTableName()))
.setQuery(ValueUtil.validateNull(DictionaryUtil.getQueryWithReferencesFromTab(tab)))
.setWhereClause(whereClause.toString())
.setOrderByClause(ValueUtil.validateNull(tab.getOrderByClause()))
.setParentTabUuid(ValueUtil.validateNull(parentTabUuid))
.setIsChangeLog(table.isChangeLog())
.setIsActive(tab.isActive());
.setIsActive(tab.isActive())
.addAllContextColumnNames(DictionaryUtil.getContextColumnNames(Optional.ofNullable(whereClause.toString()).orElse("") + Optional.ofNullable(tab.getOrderByClause()).orElse("")));
// For link
if(contextInfoId > 0) {
ContextInfo.Builder contextInfoBuilder = convertContextInfo(context, contextInfoId);
Expand Down Expand Up @@ -888,8 +883,8 @@ private Process.Builder convertProcess(Properties context, MProcess process, boo
* @return
*/
private Browser.Builder convertBrowser(Properties context, MBrowse browser, boolean withFields) {
String query = addQueryReferencesFromBrowser(browser, MView.getSQLFromView(browser.getAD_View_ID(), null));
String orderByClause = getSQLOrderBy(browser);
String query = DictionaryUtil.addQueryReferencesFromBrowser(browser);
String orderByClause = DictionaryUtil.getSQLOrderBy(browser);
Browser.Builder builder = Browser.newBuilder()
.setId(browser.getAD_Process_ID())
.setUuid(ValueUtil.validateNull(browser.getUUID()))
Expand All @@ -905,9 +900,7 @@ private Browser.Builder convertBrowser(Properties context, MBrowse browser, bool
.setIsSelectedByDefault(browser.isSelectedByDefault())
.setIsShowTotal(browser.isShowTotal())
.setIsUpdateable(browser.isUpdateable())
.setQuery(ValueUtil.validateNull(query))
.setWhereClause(ValueUtil.validateNull(browser.getWhereClause()))
.setOrderByClause(ValueUtil.validateNull(orderByClause));
.addAllContextColumnNames(DictionaryUtil.getContextColumnNames(Optional.ofNullable(query).orElse("") + Optional.ofNullable(browser.getWhereClause()).orElse("") + Optional.ofNullable(orderByClause).orElse("")));
// Set View UUID
if(browser.getAD_View_ID() > 0) {
builder.setViewUuid(ValueUtil.validateNull(browser.getAD_View().getUUID()));
Expand Down Expand Up @@ -935,77 +928,6 @@ private Browser.Builder convertBrowser(Properties context, MBrowse browser, bool
return builder;
}

/**
* Add references to original query from smart browser
* @param originalQuery
* @return
*/
private String addQueryReferencesFromBrowser(MBrowse browser, String originalQuery) {
int fromIndex = originalQuery.toUpperCase().indexOf(" FROM ");
StringBuffer queryToAdd = new StringBuffer(originalQuery.substring(0, fromIndex));
StringBuffer joinsToAdd = new StringBuffer(originalQuery.substring(fromIndex, originalQuery.length() - 1));
for (MBrowseField browseField : browser.getDisplayFields()) {
int displayTypeId = browseField.getAD_Reference_ID();
if(DisplayType.isLookup(displayTypeId)) {
// Reference Value
int referenceValueId = browseField.getAD_Reference_Value_ID();
// Validation Code
String columnName = browseField.getAD_Element().getColumnName();
String tableName = browseField.getAD_View_Column().getAD_View_Definition().getTableAlias();
if(browseField.getAD_View_Column().getAD_Column_ID() > 0) {
columnName = browseField.getAD_View_Column().getAD_Column().getColumnName();
}
queryToAdd.append(", ");
ReferenceInfo referenceInfo = ReferenceUtil.getInstance(Env.getCtx()).getReferenceInfo(displayTypeId, referenceValueId, columnName, Env.getAD_Language(Env.getCtx()), tableName);
if(referenceInfo != null) {
queryToAdd.append(referenceInfo.getDisplayValue(browseField.getAD_View_Column().getColumnName()));
joinsToAdd.append(referenceInfo.getJoinValue(columnName, tableName));
}
}
}
queryToAdd.append(joinsToAdd);
return queryToAdd.toString();
}

/**
* Get Order By
* @param browser
* @return
*/
public String getSQLOrderBy(MBrowse browser) {
StringBuilder sqlOrderBy = new StringBuilder();
for (MBrowseField field : browser.getOrderByFields()) {
if (field.isOrderBy()) {
int orderByPosition = getOrderByPosition(browser, field);
if (orderByPosition <= 0)
continue;

if (sqlOrderBy.length() > 0) {
sqlOrderBy.append(",");
}
sqlOrderBy.append(orderByPosition);
}
}
return sqlOrderBy.length() > 0 ? sqlOrderBy.toString(): "";
}

/**
* Get Order By Postirion for SB
* @param BrowserField
* @return
*/
private int getOrderByPosition(MBrowse browser, MBrowseField BrowserField) {
int colOffset = 1; // columns start with 1
int col = 0;
for (MBrowseField field : browser.getFields()) {
int sortBySqlNo = col + colOffset;
if (BrowserField.getAD_Browse_Field_ID() == field.getAD_Browse_Field_ID())
return sortBySqlNo;
col ++;
}
return -1;
}

/**
* Get process action from tab
* @param tab
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@
import org.spin.grpc.util.GetReportOutputRequest;
import org.spin.grpc.util.GetResourceReferenceRequest;
import org.spin.grpc.util.GetResourceRequest;
import org.spin.grpc.util.KeyValue;
import org.spin.grpc.util.ListBrowserItemsRequest;
import org.spin.grpc.util.ListBrowserItemsResponse;
import org.spin.grpc.util.ListDrillTablesRequest;
Expand Down Expand Up @@ -854,7 +855,7 @@ private ListTabEntitiesResponse.Builder convertEntitiesList(Properties context,
MTab tab = MTab.get(context, tabId);
String tableName = MTable.getTableName(context, tab.getAD_Table_ID());
Env.clearWinContext(request.getWindowNo());
Map<String, Object> attributes = ValueUtil.convertValuesToObjects(request.getAttributesList());
Map<String, Object> attributes = ValueUtil.convertValuesToObjects(request.getContextAttributesList());
// Fill context
attributes.entrySet().forEach(attribute -> {
if(attribute.getValue() instanceof Integer) {
Expand Down Expand Up @@ -2341,10 +2342,17 @@ private MQuery getReportQueryFromCriteria(Criteria criteria) {
* @param values
* @return
*/
private String getBrowserWhereClause(MBrowse browser, String parsedWhereClause, HashMap<String, Object> parameterMap, List<Object> values) {
private String getBrowserWhereClause(MBrowse browser, String parsedWhereClause, List<KeyValue> contextAttributes, HashMap<String, Object> parameterMap, List<Object> values) {
StringBuilder browserWhereClause = new StringBuilder();
List<MBrowseField> fields = ASPUtil.getInstance().getBrowseFields(browser.getAD_Browse_ID());
LinkedHashMap<String, MBrowseField> fieldsMap = new LinkedHashMap<>();
AtomicReference<String> convertedWhereClause = new AtomicReference<String>(parsedWhereClause);
if(parsedWhereClause != null
&& contextAttributes != null) {
contextAttributes.forEach(contextValue -> {
convertedWhereClause.set(convertedWhereClause.get().replaceAll("@" + contextValue.getKey() + "@", String.valueOf(ValueUtil.getObjectFromValue(contextValue.getValue()))));
});
}
// Add field to map
for(MBrowseField field: fields) {
fieldsMap.put(field.getAD_View_Column().getColumnName(), field);
Expand Down Expand Up @@ -2432,8 +2440,8 @@ else if (parameterValue == null && field.isRange()) {
//
String whereClause = null;
//
if(!Util.isEmpty(parsedWhereClause)) {
whereClause = parsedWhereClause.toString();
if(!Util.isEmpty(convertedWhereClause.get())) {
whereClause = convertedWhereClause.get();
}
if(browserWhereClause.length() > 0) {
if(Util.isEmpty(whereClause)) {
Expand Down Expand Up @@ -2461,12 +2469,16 @@ private ListBrowserItemsResponse.Builder convertBrowserList(ListBrowserItemsRequ
// Populate map
criteria.getConditionsList().forEach(condition -> parameterMap.put(condition.getColumnName(), ValueUtil.getObjectFromValue(condition.getValue())));
List<Object> values = new ArrayList<Object>();
String whereClause = getBrowserWhereClause(browser, criteria.getWhereClause(), parameterMap, values);
String whereClause = getBrowserWhereClause(browser, browser.getWhereClause(), request.getContextAttributesList(), parameterMap, values);
// Page prefix
int page = RecordUtil.getPageNumber(request.getClientRequest().getSessionUuid(), request.getPageToken());
StringBuilder sql = new StringBuilder(criteria.getQuery());
String query = DictionaryUtil.addQueryReferencesFromBrowser(browser);
String orderByClause = DictionaryUtil.getSQLOrderBy(browser);
StringBuilder sql = new StringBuilder(query);
if (!Util.isEmpty(whereClause)) {
sql.append(" WHERE ").append(whereClause); // includes first AND
} else {
sql.append(" WHERE 1=1");
}
MView view = browser.getAD_View();
MViewDefinition parentDefinition = view.getParentViewDefinition();
Expand All @@ -2476,7 +2488,6 @@ private ListBrowserItemsResponse.Builder convertBrowserList(ListBrowserItemsRequ
String parsedSQL = MRole.getDefault().addAccessSQL(sql.toString(),
tableNameAlias, MRole.SQL_FULLYQUALIFIED,
MRole.SQL_RO);
String orderByClause = criteria.getOrderByClause();
if(Util.isEmpty(orderByClause)) {
orderByClause = "";
} else {
Expand All @@ -2490,11 +2501,7 @@ private ListBrowserItemsResponse.Builder convertBrowserList(ListBrowserItemsRequ
nexPageToken = RecordUtil.getPagePrefix(request.getClientRequest().getSessionUuid()) + (page + 1);
}
// Add Row Number
if(!Util.isEmpty(whereClause)) {
parsedSQL = parsedSQL + " AND ROWNUM >= " + page + " AND ROWNUM <= " + RecordUtil.PAGE_SIZE;
} else {
parsedSQL = parsedSQL + " WHERE ROWNUM >= " + page + " AND ROWNUM <= " + RecordUtil.PAGE_SIZE;
}
parsedSQL = parsedSQL + " AND ROWNUM >= " + page + " AND ROWNUM <= " + RecordUtil.PAGE_SIZE;
// Add Order By
parsedSQL = parsedSQL + orderByClause;
// Return
Expand Down Expand Up @@ -2639,7 +2646,7 @@ private org.spin.grpc.util.Callout.Builder runcallout(RunCalloutRequest request)
gridTab.clearSelection();
gridTab.dataNew(false);
// load values
Map<String, Object> attributes = ValueUtil.convertValuesToObjects(request.getAttributesList());
Map<String, Object> attributes = ValueUtil.convertValuesToObjects(request.getContextAttributesList());
for(Entry<String, Object> attribute : attributes.entrySet()) {
gridTab.setValue(attribute.getKey(), attribute.getValue());
}
Expand Down
Loading

0 comments on commit f325e0b

Please sign in to comment.