IDEMPIERE-3169 recent item do a lot query / implement cache for the label of recent items

This commit is contained in:
Carlos Ruiz 2018-06-07 10:34:08 +02:00
parent 667875b709
commit 18017938e6
2 changed files with 55 additions and 16 deletions

View File

@ -16,11 +16,13 @@ package org.compiere.model;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.base.Service; import org.adempiere.base.Service;
import org.adempiere.base.event.EventManager; import org.adempiere.base.event.EventManager;
@ -44,16 +46,18 @@ public class MRecentItem extends X_AD_RecentItem
/** /**
* *
*/ */
private static final long serialVersionUID = 6899554875745832L; private static final long serialVersionUID = -311416268128338337L;
public static final String ON_RECENT_ITEM_CHANGED_TOPIC = "onRecentItemChanged"; public static final String ON_RECENT_ITEM_CHANGED_TOPIC = "onRecentItemChanged";
/** Recent Item Cache */ /** Recent Item Cache */
private static CCache<Integer,MRecentItem> s_cache = new CCache<Integer,MRecentItem>(Table_Name, 10); private static CCache<String,MRecentItem> s_cache = new CCache<String,MRecentItem>(Table_Name, 10);
/** Logger */ /** Logger */
@SuppressWarnings("unused")
private static CLogger s_log = CLogger.getCLogger(MRecentItem.class); private static CLogger s_log = CLogger.getCLogger(MRecentItem.class);
/* Recent Item cached Label */
private String m_label;
/************************************************************************** /**************************************************************************
* Standard Constructor * Standard Constructor
* @param ctx context * @param ctx context
@ -65,13 +69,17 @@ public class MRecentItem extends X_AD_RecentItem
super (ctx, AD_RecentItem_ID, trxName); super (ctx, AD_RecentItem_ID, trxName);
if (AD_RecentItem_ID > 0) { if (AD_RecentItem_ID > 0) {
synchronized (MRecentItem.class) { synchronized (MRecentItem.class) {
Integer key = new Integer (AD_RecentItem_ID); String key = getCacheKey(AD_RecentItem_ID, ctx);
if (!s_cache.containsKey(key)) if (!s_cache.containsKey(key))
s_cache.put (key, this); s_cache.put (key, this);
} }
} }
} // MRecentItem } // MRecentItem
private static String getCacheKey(int AD_RecentItem_ID, Properties ctx) {
return AD_RecentItem_ID + "|" + Env.getAD_Language(ctx);
}
/** /**
* Load Constructor * Load Constructor
* @param ctx ctx * @param ctx ctx
@ -81,9 +89,9 @@ public class MRecentItem extends X_AD_RecentItem
public MRecentItem (Properties ctx, ResultSet rs, String trxName) public MRecentItem (Properties ctx, ResultSet rs, String trxName)
{ {
super(ctx, rs, trxName); super(ctx, rs, trxName);
Integer key = null; String key = null;
try { try {
key = new Integer (rs.getInt("AD_RecentItem_ID")); key = getCacheKey(rs.getInt("AD_RecentItem_ID"), ctx);
} catch (SQLException e) { } catch (SQLException e) {
throw new AdempiereException(e); throw new AdempiereException(e);
} }
@ -101,7 +109,7 @@ public class MRecentItem extends X_AD_RecentItem
*/ */
public static synchronized MRecentItem get (Properties ctx, int AD_RecentItem_ID) public static synchronized MRecentItem get (Properties ctx, int AD_RecentItem_ID)
{ {
Integer ii = new Integer (AD_RecentItem_ID); String ii = getCacheKey(AD_RecentItem_ID, ctx);
MRecentItem ri = (MRecentItem)s_cache.get(ii); MRecentItem ri = (MRecentItem)s_cache.get(ii);
if (ri == null) if (ri == null)
ri = new MRecentItem (ctx, AD_RecentItem_ID, null); ri = new MRecentItem (ctx, AD_RecentItem_ID, null);
@ -123,7 +131,8 @@ public class MRecentItem extends X_AD_RecentItem
MRecentItem retValue = it.next(); MRecentItem retValue = it.next();
if (retValue.getAD_Table_ID() == AD_Table_ID if (retValue.getAD_Table_ID() == AD_Table_ID
&& retValue.getRecord_ID() == Record_ID && retValue.getRecord_ID() == Record_ID
&& retValue.getCtx() == ctx && retValue.getAD_User_ID() == AD_User_ID
&& Env.getAD_Language(ctx).equals(Env.getAD_Language(retValue.getCtx()))
) )
{ {
return retValue; return retValue;
@ -155,7 +164,7 @@ public class MRecentItem extends X_AD_RecentItem
if (retValue != null) if (retValue != null)
{ {
Integer key = new Integer (retValue.getAD_RecentItem_ID()); String key = getCacheKey(retValue.getAD_RecentItem_ID(), ctx);
s_cache.put (key, retValue); s_cache.put (key, retValue);
} }
return retValue; return retValue;
@ -265,7 +274,7 @@ public class MRecentItem extends X_AD_RecentItem
@Override @Override
public boolean delete(boolean force) { public boolean delete(boolean force) {
Integer ii = new Integer (getAD_RecentItem_ID()); String ii = getCacheKey(getAD_RecentItem_ID(), getCtx());
synchronized (MRecentItem.class) { synchronized (MRecentItem.class) {
s_cache.remove(ii); s_cache.remove(ii);
} }
@ -273,16 +282,23 @@ public class MRecentItem extends X_AD_RecentItem
} }
public static List<MRecentItem> getFromUser(Properties ctx, int AD_User_ID) { public static List<MRecentItem> getFromUser(Properties ctx, int AD_User_ID) {
List<MRecentItem> ris = new Query(ctx, MRecentItem.Table_Name, "NVL(AD_User_ID,0)=?", null) int[] ids = new Query(ctx, MRecentItem.Table_Name, "NVL(AD_User_ID,0)=?", null)
.setOnlyActiveRecords(true) .setOnlyActiveRecords(true)
.setClient_ID() .setClient_ID()
.setParameters(AD_User_ID) .setParameters(AD_User_ID)
.setOrderBy("Updated DESC") .setOrderBy("Updated DESC")
.list(); .getIDs();
List<MRecentItem> ris = new ArrayList<MRecentItem>();
for (int id : ids) {
ris.add(MRecentItem.get(ctx, id));
}
return ris; return ris;
} }
public String getLabel() { public String getLabel() {
if (m_label != null) {
return m_label;
}
String windowName; String windowName;
MWindow win = MWindow.get(getCtx(), getAD_Window_ID()); MWindow win = MWindow.get(getCtx(), getAD_Window_ID());
MUserDefWin userDef = MUserDefWin.getBestMatch(getCtx(), getAD_Window_ID()); MUserDefWin userDef = MUserDefWin.getBestMatch(getCtx(), getAD_Window_ID());
@ -322,7 +338,29 @@ public class MRecentItem extends X_AD_RecentItem
if (recordIdentifier.length() == 0) if (recordIdentifier.length() == 0)
recordIdentifier.append(" [no identifier]"); recordIdentifier.append(" [no identifier]");
} }
return windowName + ": " + recordIdentifier.substring(1); m_label = windowName + ": " + recordIdentifier.substring(1);
if (s_log.isLoggable(Level.INFO)) s_log.info(m_label);
return m_label;
}
public static void clearLabel(int AD_Table_ID, int Record_ID) {
Iterator<MRecentItem> it = s_cache.values().iterator();
while (it.hasNext()) {
MRecentItem retValue = it.next();
if (retValue.getAD_Table_ID() == AD_Table_ID && retValue.getRecord_ID() == Record_ID) {
retValue.clearLabel();
}
}
}
private void clearLabel() {
m_label = null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("MRecentItem[").append(get_ID()).append("]=").append(getLabel());
return sb.toString();
} }
} // MRecentItem } // MRecentItem

View File

@ -2341,9 +2341,10 @@ public abstract class PO
m_newValues = new Object[size]; m_newValues = new Object[size];
m_createNew = false; m_createNew = false;
} }
if (!newRecord) if (!newRecord) {
CacheMgt.get().reset(p_info.getTableName()); CacheMgt.get().reset(p_info.getTableName());
else if (get_ID() > 0 && success) MRecentItem.clearLabel(p_info.getAD_Table_ID(), get_ID());
} else if (get_ID() > 0 && success)
CacheMgt.get().newRecord(p_info.getTableName(), get_ID()); CacheMgt.get().newRecord(p_info.getTableName(), get_ID());
return success; return success;