From e73ce68e8f47396c80e83990c2f27e1f23a1a64f Mon Sep 17 00:00:00 2001 From: Britt Park Date: Thu, 26 Apr 2007 15:53:13 +0000 Subject: [PATCH] Reworked MapEntry schema for better cache performance. Set Attribute entities to be not lazy. Additional AttributeService testing. Fixed DoubleAttributeImpl's declaration to implement DoubleAttribute. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5566 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/attributes/AttrQueryTest.java | 2 +- .../repo/attributes/AttributeServiceTest.java | 9 ++ .../repo/attributes/DoubleAttributeImpl.java | 2 +- .../repo/attributes/ListEntryKey.java | 2 + .../repo/attributes/MapAttributeImpl.java | 18 ++-- .../alfresco/repo/attributes/MapEntry.java | 14 +--- .../alfresco/repo/attributes/MapEntryDAO.java | 3 +- .../repo/attributes/MapEntryImpl.java | 46 +--------- .../alfresco/repo/attributes/MapEntryKey.java | 83 +++++++++++++++++++ .../hibernate/AttributeDAOHibernate.java | 4 +- .../attributes/hibernate/Attributes.hbm.xml | 45 +++++----- .../hibernate/MapEntryDAOHibernate.java | 15 ++-- .../cmr/attributes/AttrQueryEquals.java | 2 +- .../service/cmr/attributes/AttrQueryGT.java | 2 +- .../service/cmr/attributes/AttrQueryGTE.java | 2 +- .../service/cmr/attributes/AttrQueryLT.java | 2 +- .../service/cmr/attributes/AttrQueryLTE.java | 2 +- .../service/cmr/attributes/AttrQueryLike.java | 2 +- .../service/cmr/attributes/AttrQueryNE.java | 2 +- 19 files changed, 150 insertions(+), 107 deletions(-) create mode 100644 source/java/org/alfresco/repo/attributes/MapEntryKey.java diff --git a/source/java/org/alfresco/repo/attributes/AttrQueryTest.java b/source/java/org/alfresco/repo/attributes/AttrQueryTest.java index 3c26ecbdda..e20fa3f81d 100644 --- a/source/java/org/alfresco/repo/attributes/AttrQueryTest.java +++ b/source/java/org/alfresco/repo/attributes/AttrQueryTest.java @@ -65,7 +65,7 @@ public class AttrQueryTest extends TestCase String predicate = query.getPredicate(fHelper); System.out.println(predicate); System.out.println(fHelper.getParameters()); - assertEquals("((me.key > :name0 and me.key < :name1) or (not me.key like :name2))", + assertEquals("((me.key.key > :name0 and me.key.key < :name1) or (not me.key.key like :name2))", predicate); assertEquals("cat", fHelper.getParameters().get("name0")); assertEquals("hat", fHelper.getParameters().get("name1")); diff --git a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java index d0eea55b82..7fbd1df2c4 100644 --- a/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java +++ b/source/java/org/alfresco/repo/attributes/AttributeServiceTest.java @@ -306,6 +306,15 @@ public class AttributeServiceTest extends TestCase Attribute replace = new StringAttributeValue("String"); fService.setAttribute("dummy", 2, replace); assertEquals("String", fService.getAttribute("dummy/2").getStringValue()); + MapAttribute map = new MapAttributeValue(); + map.put("list", list); + MapAttribute subMap = new MapAttributeValue(); + subMap.put("a", new StringAttributeValue("polyester")); + subMap.put("b", new StringAttributeValue("donuts")); + subMap.put("c", new StringAttributeValue("brutality")); + list.add(subMap); + fService.setAttribute("", "map", map); + assertEquals("donuts", fService.getAttribute("map/list/5/b").getStringValue()); } catch (Exception e) { diff --git a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java index 8313a64043..3f09dffeb9 100644 --- a/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/DoubleAttributeImpl.java @@ -31,7 +31,7 @@ import org.alfresco.repo.avm.AVMDAOs; * Persistent double attribute implementation. * @author britt */ -public class DoubleAttributeImpl extends AttributeImpl implements Attribute +public class DoubleAttributeImpl extends AttributeImpl implements DoubleAttribute { private static final long serialVersionUID = 6615023606094278263L; diff --git a/source/java/org/alfresco/repo/attributes/ListEntryKey.java b/source/java/org/alfresco/repo/attributes/ListEntryKey.java index 63d51eb2fd..3c90d9f22b 100644 --- a/source/java/org/alfresco/repo/attributes/ListEntryKey.java +++ b/source/java/org/alfresco/repo/attributes/ListEntryKey.java @@ -33,6 +33,8 @@ import java.io.Serializable; */ public class ListEntryKey implements Serializable { + private static final long serialVersionUID = 7314576560198411815L; + private ListAttribute fList; private int fIndex; diff --git a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java index 89a9e5bb1e..d3db4bb313 100644 --- a/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java +++ b/source/java/org/alfresco/repo/attributes/MapAttributeImpl.java @@ -120,7 +120,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute throw new AlfrescoRuntimeException("Unknown Attribute Type: " + value.getType()); } } - MapEntry mapEntry = new MapEntryImpl(this, entry.getKey(), newAttr); + MapEntryKey key = new MapEntryKey(this, entry.getKey()); + MapEntry mapEntry = new MapEntryImpl(key, newAttr); AVMDAOs.Instance().fMapEntryDAO.save(mapEntry); } } @@ -152,7 +153,7 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute Map map = new HashMap(); for (MapEntry entry : entries) { - map.put(entry.getKey(), entry.getAttribute()); + map.put(entry.getKey().getKey(), entry.getAttribute()); } return map.entrySet(); } @@ -163,7 +164,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute @Override public Attribute get(String key) { - MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(this, key); + MapEntryKey entryKey = new MapEntryKey(this, key); + MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(entryKey); if (entry == null) { return null; @@ -181,7 +183,7 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute Set keys = new HashSet(); for (MapEntry entry : entries) { - keys.add(entry.getKey()); + keys.add(entry.getKey().getKey()); } return keys; } @@ -192,7 +194,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute @Override public void put(String key, Attribute value) { - MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(this, key); + MapEntryKey entryKey = new MapEntryKey(this, key); + MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(entryKey); if (entry != null) { Attribute oldAttr = entry.getAttribute(); @@ -200,7 +203,7 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute AVMDAOs.Instance().fAttributeDAO.delete(oldAttr); return; } - entry = new MapEntryImpl(this, key, value); + entry = new MapEntryImpl(entryKey, value); AVMDAOs.Instance().fMapEntryDAO.save(entry); } @@ -210,7 +213,8 @@ public class MapAttributeImpl extends AttributeImpl implements MapAttribute @Override public void remove(String key) { - MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(this, key); + MapEntryKey entryKey = new MapEntryKey(this, key); + MapEntry entry = AVMDAOs.Instance().fMapEntryDAO.get(entryKey); if (entry == null) { throw new AVMNotFoundException("Attribute Not Found: " + key); diff --git a/source/java/org/alfresco/repo/attributes/MapEntry.java b/source/java/org/alfresco/repo/attributes/MapEntry.java index c6f1367b77..bb36cd0512 100644 --- a/source/java/org/alfresco/repo/attributes/MapEntry.java +++ b/source/java/org/alfresco/repo/attributes/MapEntry.java @@ -35,19 +35,7 @@ public interface MapEntry * Get the primary key. * @return The key. */ - public long getId(); - - /** - * Get the map attribute that this entry belongs to. - * @return The map attribute. - */ - public MapAttribute getMap(); - - /** - * Get the lookup key for this entry. - * @return The key. - */ - public String getKey(); + public MapEntryKey getKey(); /** * Get the value attribute. diff --git a/source/java/org/alfresco/repo/attributes/MapEntryDAO.java b/source/java/org/alfresco/repo/attributes/MapEntryDAO.java index 1e4f5b16f0..861a8cbf91 100644 --- a/source/java/org/alfresco/repo/attributes/MapEntryDAO.java +++ b/source/java/org/alfresco/repo/attributes/MapEntryDAO.java @@ -28,11 +28,10 @@ public interface MapEntryDAO /** * Get an entry by name. - * @param mapAttr The map to get the entry from. * @param key The key of the entry. * @return A MapEntry or null. */ - public MapEntry get(MapAttribute mapAttr, String key); + public MapEntry get(MapEntryKey key); /** * Retrieve all the entries in a map. diff --git a/source/java/org/alfresco/repo/attributes/MapEntryImpl.java b/source/java/org/alfresco/repo/attributes/MapEntryImpl.java index c56357ec79..810beb0a15 100644 --- a/source/java/org/alfresco/repo/attributes/MapEntryImpl.java +++ b/source/java/org/alfresco/repo/attributes/MapEntryImpl.java @@ -31,11 +31,7 @@ package org.alfresco.repo.attributes; */ public class MapEntryImpl implements MapEntry { - private long fID; - - private MapAttribute fMap; - - private String fKey; + private MapEntryKey fKey; private Attribute fAttribute; @@ -43,11 +39,9 @@ public class MapEntryImpl implements MapEntry { } - public MapEntryImpl(MapAttribute map, - String key, + public MapEntryImpl(MapEntryKey key, Attribute attribute) { - fMap = map; fKey = key; fAttribute = attribute; } @@ -69,26 +63,10 @@ public class MapEntryImpl implements MapEntry fAttribute = attr; } - /* (non-Javadoc) - * @see org.alfresco.repo.attributes.MapEntry#getId() - */ - public long getId() - { - return fID; - } - - /** - * Setter. - */ - public void setId(long id) - { - fID = id; - } - /* (non-Javadoc) * @see org.alfresco.repo.attributes.MapEntry#getKey() */ - public String getKey() + public MapEntryKey getKey() { return fKey; } @@ -96,24 +74,8 @@ public class MapEntryImpl implements MapEntry /** * Setter. */ - public void setKey(String key) + public void setKey(MapEntryKey key) { fKey = key; } - - /* (non-Javadoc) - * @see org.alfresco.repo.attributes.MapEntry#getMap() - */ - public MapAttribute getMap() - { - return fMap; - } - - /** - * Setter. - */ - public void setMap(MapAttribute map) - { - fMap = map; - } } diff --git a/source/java/org/alfresco/repo/attributes/MapEntryKey.java b/source/java/org/alfresco/repo/attributes/MapEntryKey.java new file mode 100644 index 0000000000..f97bb00110 --- /dev/null +++ b/source/java/org/alfresco/repo/attributes/MapEntryKey.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing + */ + +package org.alfresco.repo.attributes; + +import java.io.Serializable; + +/** + * Key class for MapEntries. + * @author britt + */ +public class MapEntryKey implements Serializable +{ + private static final long serialVersionUID = 1637682889407656800L; + + private MapAttribute fMap; + + private String fKey; + + public MapEntryKey() + { + } + + public MapEntryKey(MapAttribute map, String key) + { + fMap = map; + fKey = key; + } + + /** + * @return the Key + */ + public String getKey() + { + return fKey; + } + + /** + * @param key the Key to set + */ + public void setKey(String key) + { + fKey = key; + } + + /** + * @return the Map + */ + public MapAttribute getMap() + { + return fMap; + } + + /** + * @param map the Map to set + */ + public void setMap(MapAttribute map) + { + fMap = map; + } +} diff --git a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java index 5dfab1abf9..be71de69d2 100644 --- a/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java +++ b/source/java/org/alfresco/repo/attributes/hibernate/AttributeDAOHibernate.java @@ -109,7 +109,7 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements { AttrQueryHelper helper = new AttrQueryHelperImpl(); String predicate = query.getPredicate(helper); - String fullQuery = "from MapEntryImpl me where me.map = :map and " + predicate; + String fullQuery = "from MapEntryImpl me where me.key.map = :map and " + predicate; Query hQuery = getSession().createQuery(fullQuery); hQuery.setEntity("map", map); for (Map.Entry param : helper.getParameters().entrySet()) @@ -120,7 +120,7 @@ public class AttributeDAOHibernate extends HibernateDaoSupport implements List> result = new ArrayList>(); for (MapEntry entry : hits) { - result.add(new Pair(entry.getKey(), entry.getAttribute())); + result.add(new Pair(entry.getKey().getKey(), entry.getAttribute())); } return result; } diff --git a/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml b/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml index 7e6a1f3b5d..4e306cbadc 100644 --- a/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml +++ b/source/java/org/alfresco/repo/attributes/hibernate/Attributes.hbm.xml @@ -7,7 +7,7 @@ + lazy="false"> @@ -17,76 +17,73 @@ - - - - - - - - - - - - - + - + - - - - - - - - + + + + + @@ -94,6 +91,6 @@ - + diff --git a/source/java/org/alfresco/repo/attributes/hibernate/MapEntryDAOHibernate.java b/source/java/org/alfresco/repo/attributes/hibernate/MapEntryDAOHibernate.java index 8a55dd9462..766b804340 100644 --- a/source/java/org/alfresco/repo/attributes/hibernate/MapEntryDAOHibernate.java +++ b/source/java/org/alfresco/repo/attributes/hibernate/MapEntryDAOHibernate.java @@ -30,6 +30,8 @@ import java.util.List; import org.alfresco.repo.attributes.MapAttribute; import org.alfresco.repo.attributes.MapEntry; import org.alfresco.repo.attributes.MapEntryDAO; +import org.alfresco.repo.attributes.MapEntryImpl; +import org.alfresco.repo.attributes.MapEntryKey; import org.hibernate.Query; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; @@ -53,7 +55,7 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements */ public void delete(MapAttribute mapAttr) { - Query query = getSession().createQuery("delete from MapEntryImpl me where me.map = :map"); + Query query = getSession().createQuery("delete from MapEntryImpl me where me.key.map = :map"); query.setEntity("map", mapAttr); query.executeUpdate(); } @@ -61,12 +63,9 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements /* (non-Javadoc) * @see org.alfresco.repo.attributes.MapEntryDAO#get(org.alfresco.repo.attributes.MapAttribute, java.lang.String) */ - public MapEntry get(MapAttribute mapAttr, String key) + public MapEntry get(MapEntryKey key) { - Query query = getSession().createQuery("from MapEntryImpl me where me.map = :map and me.key = :key"); - query.setEntity("map", mapAttr); - query.setParameter("key", key); - return (MapEntry)query.uniqueResult(); + return (MapEntry)getSession().get(MapEntryImpl.class, key); } /* (non-Javadoc) @@ -75,7 +74,7 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements @SuppressWarnings("unchecked") public List get(MapAttribute mapAttr) { - Query query = getSession().createQuery("from MapEntryImpl me where me.map = :map"); + Query query = getSession().createQuery("from MapEntryImpl me where me.key.map = :map"); query.setEntity("map", mapAttr); return (List)query.list(); } @@ -93,7 +92,7 @@ public class MapEntryDAOHibernate extends HibernateDaoSupport implements */ public int size(MapAttribute mapAttr) { - Query query = getSession().createQuery("select count(me) from MapEntryImpl me where me.map = :map"); + Query query = getSession().createQuery("select count(*) from MapEntryImpl me where me.key.map = :map"); query.setEntity("map", mapAttr); return ((Long)query.uniqueResult()).intValue(); } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryEquals.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryEquals.java index 2054d0c962..b17a741ab9 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryEquals.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryEquals.java @@ -46,6 +46,6 @@ public class AttrQueryEquals extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key = :" + name; + return "me.key.key = :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryGT.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryGT.java index 5509c2a397..1d1bc0ada9 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryGT.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryGT.java @@ -49,6 +49,6 @@ public class AttrQueryGT extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key > :" + name; + return "me.key.key > :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryGTE.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryGTE.java index 3b30f03835..3739d07fb8 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryGTE.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryGTE.java @@ -50,6 +50,6 @@ public class AttrQueryGTE extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key >= :" + name; + return "me.key.key >= :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLT.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLT.java index 94ec679cb9..71cfa8adb6 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLT.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLT.java @@ -49,6 +49,6 @@ public class AttrQueryLT extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key < :" + name; + return "me.key.key < :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLTE.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLTE.java index fb30b9e9ac..c95b3e61a5 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLTE.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLTE.java @@ -49,6 +49,6 @@ public class AttrQueryLTE extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key <= :" + name; + return "me.key.key <= :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLike.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLike.java index b3b1609244..47d38c51c8 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryLike.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryLike.java @@ -50,6 +50,6 @@ public class AttrQueryLike extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key like :" + name; + return "me.key.key like :" + name; } } diff --git a/source/java/org/alfresco/service/cmr/attributes/AttrQueryNE.java b/source/java/org/alfresco/service/cmr/attributes/AttrQueryNE.java index 61c3c737f6..104c5ac235 100644 --- a/source/java/org/alfresco/service/cmr/attributes/AttrQueryNE.java +++ b/source/java/org/alfresco/service/cmr/attributes/AttrQueryNE.java @@ -49,6 +49,6 @@ public class AttrQueryNE extends AttrQuery { String name = "name" + helper.getNextSuffix(); helper.setParameter(name, fValue); - return "me.key <> :" + name; + return "me.key.key <> :" + name; } }