Elias, there are a number of things in this commit that seem a little strange to me ...

1. why do we need 3 separate tables for the tag aggregate data?

2. why do we need a SummariesTask to run asynchronously? i thought the aggregate data was going to be compiled at the time the tags were saved with the entry?

3. why do we need to move things into a separate TagManager class?

Also, I am noticing that the formatting of your code is not always consistent. For example, in the WeblogTagAggregateData class you are mixing code formatting styles. Maybe that's just a copy/paste issue, but I think it's important that as we add new code we keep the formatting consistent.

-- Allen


[EMAIL PROTECTED] wrote:
Author: eliast
Date: Wed Sep 27 21:38:07 2006
New Revision: 450690

URL: http://svn.apache.org/viewvc?view=rev&rev=450690
Log:
Added code to summarize tag table into aggregate tables for better performance

- Added a new TagManager and dependencies
- Added two new beans: SiteTagAggregateData and WeblogTagAggregateData
- Added a new task: TagSummariesTask
- Moved method from WeblogManager to TagManager (getTags())
- Modified createdb.vm to include the two new tables

Added:
    
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
   (with props)
    incubator/roller/trunk/src/org/apache/roller/model/TagManager.java   (with 
props)
    
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java   
(with props)
    
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java  
 (with props)
    
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
   (with props)
Modified:
    incubator/roller/trunk/metadata/database/createdb.vm
    incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml
    
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateRollerImpl.java
    
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
    incubator/roller/trunk/src/org/apache/roller/model/Roller.java
    incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java
    
incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java
    incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml
    incubator/roller/trunk/web/WEB-INF/classes/roller.properties

Modified: incubator/roller/trunk/metadata/database/createdb.vm
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/metadata/database/createdb.vm?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/metadata/database/createdb.vm (original)
+++ incubator/roller/trunk/metadata/database/createdb.vm Wed Sep 27 21:38:07 
2006
@@ -222,15 +222,34 @@
 create index wet_userid_idx on weblogentrytag( userid );
 create index wet_name_idx on weblogentrytag( name );
-create table weblogentrytagagg (
+create table weblogtagagg (
     id              varchar(48)   not null primary key,
websiteid varchar(48) not null, name varchar(255) not null,
     count           integer              not null
 );
-create index weta_websiteid_idx on weblogentrytagagg( websiteid );
-create index weta_name_idx on weblogentrytagagg( name );
+create index weta_websiteid_idx on weblogtagagg( websiteid );
+create index weta_name_idx on weblogtagagg( name );
+
+create table usertagagg (
+    id              varchar(48)   not null primary key,
+ userid varchar(48) not null, + name varchar(255) not null,
+    count           integer              not null
+);
+
+create index userta_userid_idx on usertagagg( userid );
+create index userta_name_idx on usertagagg( name );
+
+create table sitetagagg (
+    id              varchar(48)   not null primary key,
+    name            varchar(255)  not null,
+    count           integer              not null
+);
+
+create index siteta_name_idx on sitetagagg( name );
+
create table newsfeed (
     id              varchar(48) not null primary key,

Modified: incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml 
(original)
+++ incubator/roller/trunk/metadata/database/hibernate/hibernate.cfg.xml Wed 
Sep 27 21:38:07 2006
@@ -94,7 +94,9 @@
         <mapping resource="org/apache/roller/pojos/RefererData.hbm.xml" />
<mapping resource="org/apache/roller/pojos/WeblogEntryData.hbm.xml" /> - <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/WeblogTagAggregateData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/SiteTagAggregateData.hbm.xml" /> <mapping resource="org/apache/roller/pojos/EntryAttributeData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryData.hbm.xml" 
/>
         <mapping resource="org/apache/roller/pojos/WeblogCategoryAssoc.hbm.xml" 
/>

Modified: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateRollerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateRollerImpl.java?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateRollerImpl.java
 (original)
+++ 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateRollerImpl.java
 Wed Sep 27 21:38:07 2006
@@ -29,6 +29,7 @@
 import org.apache.roller.model.AutoPingManager;
 import org.apache.roller.model.PingQueueManager;
 import org.apache.roller.model.PingTargetManager;
+import org.apache.roller.model.TagManager;
 import org.apache.roller.planet.model.PlanetManager;
 import org.apache.roller.model.PropertiesManager;
 import org.apache.roller.model.RefererManager;
@@ -63,6 +64,7 @@
     private PingQueueManager pingQueueManager = null;
     private AutoPingManager autoPingManager = null;
     private PingTargetManager pingTargetManager = null;
+    private TagManager tagManager = null;
protected HibernateRollerImpl() throws RollerException {
@@ -225,5 +227,15 @@
         }
         return pingTargetManager;
     }
+ + /**
+     * @see org.apache.roller.model.Roller#getTagManager()
+     */
+    public TagManager getTagManager() throws RollerException {
+        if (tagManager == null) {
+            tagManager = new HibernateTagManagerImpl(strategy);
+        }
+        return tagManager;
+ } }

Added: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java?view=auto&rev=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
 (added)
+++ 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
 Wed Sep 27 21:38:07 2006
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.business.hibernate;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.RollerException;
+import org.apache.roller.model.TagManager;
+import org.apache.roller.pojos.SiteTagAggregateData;
+import org.apache.roller.pojos.TagCloudEntry;
+import org.apache.roller.pojos.UserData;
+import org.apache.roller.pojos.WeblogTagAggregateData;
+import org.apache.roller.pojos.WebsiteData;
+import org.apache.roller.util.DateUtil;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.criterion.Expression;
+
+
+/**
+ * Hibernate implementation of the TagManager.
+ * @author Elias Torres (<a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>)
+ *
+ */
+public class HibernateTagManagerImpl implements TagManager {
+ + private static final long serialVersionUID = -6573148804064466850L;
+
+    private static Log log = LogFactory.getLog(HibernateTagManagerImpl.class);
+ + private HibernatePersistenceStrategy strategy = null; + + public HibernateTagManagerImpl(HibernatePersistenceStrategy strat) {
+        log.debug("Instantiating Hibernate Tag Manager");
+ + this.strategy = strat;
+    }
+
+    public List getTags(Date startDate,
+        Date endDate,
+        WebsiteData website,
+        UserData user,
+        boolean sortByCount,
+        int limit) throws RollerException {
+      try {
+        List results = new ArrayList();
+ + Session session = ((HibernatePersistenceStrategy) strategy).getSession(); + + StringBuffer queryString = new StringBuffer();
+        queryString.append("select t.name, count(t.name) ");
+        queryString.append("from WeblogEntryTagData t ");
+        queryString.append("where t.time between ? and ? ");
+        if(website != null)
+          queryString.append("and t.website.id = '" + website.getId() + "' ");
+        if(user != null)
+          queryString.append("and t.user.id = '" + user.getId() + "' ");
+        queryString.append("group by t.name ");
+        queryString.append(sortByCount ? "order by col_1_0_ desc " : "order by 
t.name ");
+
+        Query query = session.createQuery(queryString.toString());
+        query.setTimestamp(0, DateUtil.getStartOfDay(startDate));
+        query.setTimestamp(1, DateUtil.getEndOfDay(endDate));
+        if(limit > 0)
+          query.setMaxResults(limit);
+ + for (Iterator iter = query.list().iterator(); iter.hasNext();) {
+          Object[] row = (Object[]) iter.next();
+          TagCloudEntry ce = new TagCloudEntry();
+          ce.setName((String) row[0]);
+          ce.setCount(((Integer)row[1]).intValue());
+          results.add(ce);
+        }
+ + return results; + + } catch (HibernateException e) {
+        throw new RollerException(e);
+      }
+
+    }
+
+    public void release() {
+      // TODO Auto-generated method stub
+ + }
+
+    public Date summarize(Date startDate) throws RollerException {
+ + Session session = ((HibernatePersistenceStrategy) strategy).getSession(); + + // This queries the db for the last time we'll include in our batch processing
+      Query query = session.createQuery("select time from WeblogEntryTagData group 
by time order by time desc");
+      query.setMaxResults(1);
+ + Timestamp thisRun = (Timestamp) query.uniqueResult(); + + if(thisRun == null || thisRun.compareTo(startDate) == 0)
+      {
+        // nothing to do
+        log.debug("TagManager.summarize() found nothing to do.");
+        return null;
+      }
+ + // #### SiteTagAgg #### + + List params = new ArrayList(2);
+      StringBuffer queryString = new StringBuffer();
+      queryString.append("select name, count(name) from WeblogEntryTagData where 
");
+      if(startDate != null) {
+        queryString.append("time > ? and ");
+        params.add(startDate);
+      }
+      queryString.append("time <= ? group by name");
+      params.add(thisRun);
+ + query = session.createQuery(queryString.toString());
+      for(int i = 0; i < params.size(); i++)
+        query.setParameter(i, params.get(i));
+ + List results = query.list();
+      log.debug("TagManager.summarize() found " + results.size() + " tags to 
summarize.");
+ + for(Iterator it = results.iterator(); it.hasNext(); )
+      {
+        Object[] row = (Object[]) it.next();
+        String tagName = (String) row[0];
+        int tagCount = ((Integer)row[1]).intValue();
+ + SiteTagAggregateData siteData = (SiteTagAggregateData) session.createCriteria(SiteTagAggregateData.class).add(Expression.eq("name", tagName)).uniqueResult(); + if(siteData == null) + siteData = new SiteTagAggregateData(null, tagName, tagCount);
+        else
+            siteData.setCount(siteData.getCount()+tagCount);
+ + strategy.store(siteData); + } +
+      // #### WeblogTagAgg ####
+ + params = new ArrayList(2);
+      queryString = new StringBuffer();
+      queryString.append("select t.website, t.name, count(t.name) from 
WeblogEntryTagData t where ");
+      if(startDate != null) {
+        queryString.append("t.time > ? and ");
+        params.add(startDate);
+      }
+      queryString.append("t.time <= ? group by t.website, t.name");
+      params.add(thisRun);
+ + query = session.createQuery(queryString.toString());
+      for(int i = 0; i < params.size(); i++)
+        query.setParameter(i, params.get(i));
+ + results = query.list();
+      log.debug("TagManager.summarize() found " + results.size() + " tags/website 
to summarize.");
+ + for(Iterator it = results.iterator(); it.hasNext(); )
+      {
+        Object[] row = (Object[]) it.next();
+        WebsiteData website = (WebsiteData) row[0];
+        String tagName = (String) row[1];
+        int tagCount = ((Integer)row[2]).intValue();
+ + WeblogTagAggregateData weblogData = (WeblogTagAggregateData) session
+          .createCriteria(WeblogTagAggregateData.class)
+          .add(Expression.eq("name", tagName))
+          .add(Expression.eq("website", website))
+          .uniqueResult();
+ if(weblogData == null) + weblogData = new WeblogTagAggregateData(null, website, tagName, tagCount);
+        else
+          weblogData.setCount(weblogData.getCount()+tagCount);
+ + strategy.store(weblogData); + } + + session.flush(); +
+      return thisRun;
+    }
+}

Propchange: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateTagManagerImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
 (original)
+++ 
incubator/roller/trunk/src/org/apache/roller/business/hibernate/HibernateWeblogManagerImpl.java
 Wed Sep 27 21:38:07 2006
@@ -814,51 +814,7 @@
             throw new RollerException(e);
         }
     }
- - public List getTags(Date startDate,
-        Date endDate,
-        WebsiteData website,
-        UserData user,
-        boolean sortByCount,
-        int limit) throws RollerException {
-      try {
-        List results = new ArrayList();
- - Session session = ((HibernatePersistenceStrategy) strategy).getSession(); - - StringBuffer queryString = new StringBuffer();
-        queryString.append("select t.name, count(t.name) ");
-        queryString.append("from WeblogEntryTagData t ");
-        queryString.append("where t.time between ? and ? ");
-        if(website != null)
-          queryString.append("and t.website.id = '" + website.getId() + "' ");
-        if(user != null)
-          queryString.append("and t.user.id = '" + user.getId() + "' ");
-        queryString.append("group by t.name ");
-        queryString.append(sortByCount ? "order by col_1_0_ desc " : "order by 
t.name ");
-
-        Query query = session.createQuery(queryString.toString());
-        query.setTimestamp(0, DateUtil.getStartOfDay(startDate));
-        query.setTimestamp(1, DateUtil.getEndOfDay(endDate));
-        if(limit > 0)
-          query.setMaxResults(limit);
- - for (Iterator iter = query.list().iterator(); iter.hasNext();) {
-          Object[] row = (Object[]) iter.next();
-          TagCloudEntry ce = new TagCloudEntry();
-          ce.setName((String) row[0]);
-          ce.setCount(((Integer)row[1]).intValue());
-          results.add(ce);
-        }
- - return results; - - } catch (HibernateException e) {
-        throw new RollerException(e);
-      }
-
-    }
- + public List getComments(
             WebsiteData     website,
             WeblogEntryData entry,

Modified: incubator/roller/trunk/src/org/apache/roller/model/Roller.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/model/Roller.java?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/model/Roller.java (original)
+++ incubator/roller/trunk/src/org/apache/roller/model/Roller.java Wed Sep 27 
21:38:07 2006
@@ -128,6 +128,13 @@
/**
+     * Get TagManager associated with this Roller instance.
+     */
+    public TagManager getTagManager() throws RollerException;
+ + + + /**
      * Flush object states.
      */
     public void flush() throws RollerException;

Added: incubator/roller/trunk/src/org/apache/roller/model/TagManager.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/model/TagManager.java?view=auto&rev=450690
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/model/TagManager.java (added)
+++ incubator/roller/trunk/src/org/apache/roller/model/TagManager.java Wed Sep 
27 21:38:07 2006
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  The ASF licenses this file to You
+ * under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.  For additional information regarding
+ * copyright in this work, please see the NOTICE file in the top level
+ * directory of this distribution.
+ */
+
+package org.apache.roller.model;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.roller.RollerException;
+import org.apache.roller.pojos.UserData;
+import org.apache.roller.pojos.WebsiteData;
+
+/**
+ * @author Elias Torres (<a href="mailto:[EMAIL PROTECTED]">[EMAIL 
PROTECTED]</a>)
+ *
+ */
+public interface TagManager {
+ + /**
+     * Get all tag (name, count) pairs for a specific date range, optionally 
only for a given site or user.
+     * @param startDate
+     * @param endDate
+     * @param website
+     * @param user
+     * @param sortByCount
+     * @param limit
+     * @return
+     * @throws RollerException
+     */
+    public List getTags(Date startDate,
+        Date endDate,
+        WebsiteData website,
+        UserData user,
+        boolean sortByCount,
+        int limit) throws RollerException;
+ + + public Date summarize(Date startDate) throws RollerException; + + /**
+     * Release all resources held by manager.
+     */
+ public void release(); +}

Propchange: incubator/roller/trunk/src/org/apache/roller/model/TagManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/roller/trunk/src/org/apache/roller/model/TagManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: incubator/roller/trunk/src/org/apache/roller/model/TagManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java 
(original)
+++ incubator/roller/trunk/src/org/apache/roller/model/WeblogManager.java Wed 
Sep 27 21:38:07 2006
@@ -304,25 +304,7 @@
      * Get all ancestor associates for a category.
      */
     public List getWeblogCategoryAncestorAssocs(WeblogCategoryData data) 
throws RollerException;
- - /**
-     * Get all tag (name, count) pairs for a specific date range, optionally 
only for a given site or user.
-     * @param startDate
-     * @param endDate
-     * @param website
-     * @param user
-     * @param sortByCount
-     * @param limit
-     * @return
-     * @throws RollerException
-     */
-    public List getTags(Date startDate,
-        Date endDate,
-        WebsiteData website,
-        UserData user,
-        boolean sortByCount,
-        int limit) throws RollerException;
- + /**
      * Save comment.
      */

Added: 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java?view=auto&rev=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java 
(added)
+++ 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java 
Wed Sep 27 21:38:07 2006
@@ -0,0 +1,153 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+/*
+ * Generated file - Do not edit!
+ */
+package org.apache.roller.pojos;
+
+import org.apache.roller.util.PojoUtil;
+
+
+/**
+ * @author Elias Torres
+ *
+ * @ejb:bean name="SiteTagAggregateData"
+ * @struts.form include-all="true"
+ * @hibernate.class lazy="false" table="sitetagagg"
+ * @hibernate.cache usage="read-write"
+ */
+public class SiteTagAggregateData extends PersistentObject
+    implements java.io.Serializable
+{
+    private static final long serialVersionUID = -7766410727897537118L;
+    private java.lang.String id = null;
+ private java.lang.String name = null; + private int count = 0;
+
+    public SiteTagAggregateData()
+    {
+    }
+
+ public SiteTagAggregateData(java.lang.String id, + java.lang.String name, int count)
+    {
+        this.id = id;
+        this.name = name;
+        this.count = count;
+    }
+
+    public SiteTagAggregateData(SiteTagAggregateData otherData)
+    {
+        setData(otherData);
+    }
+
+    //------------------------------------------------------- Simple properties
+
+ /** + * Unique ID and primary key of this Referer.
+     *
+     * @hibernate.id column="id" generator-class="uuid.hex" 
unsaved-value="null"
+     */
+    public java.lang.String getId()
+    {
+        return this.id;
+    }
+
+    public void setId(java.lang.String id)
+    {
+        this.id = id;
+    }
+
+    /**
+     * Tag value
+     *
+     * @roller.wrapPojoMethod type="simple"
+     * @ejb:persistent-field
+     * @hibernate.property column="name" non-null="true" unique="false"
+     */
+    public String getName() {
+        return this.name;
+    }
+    /** @ejb:persistent-field */
+    public void setName( String name ) {
+        this.name = name;
+ } + + /**
+    *
+    * @roller.wrapPojoMethod type="simple"
+    * @ejb:persistent-field
+    * @hibernate.property column="count" non-null="true" unique="false"
+    */
+   public int getCount()
+   {
+       return this.count;
+   }
+
+   /** @ejb:persistent-field */
+   public void setCount(int count)
+   {
+       this.count = count;
+ } +
+   public String toString() {
+     StringBuffer str = new StringBuffer("{");
+ + str.append("id=" + id + " " +
+             "name=" + name + " " +
+             "count=" + count);
+     str.append('}');
+ + return (str.toString());
+ }
+ + public boolean equals(Object pOther) {
+       if (pOther instanceof SiteTagAggregateData) {
+           SiteTagAggregateData lTest = (SiteTagAggregateData) pOther;
+           boolean lEquals = true;
+ + lEquals = PojoUtil.equals(lEquals, this.id, lTest.getId());
+           lEquals = PojoUtil.equals(lEquals, this.name, lTest.getName());
+           lEquals = this.count == lTest.getCount();
+           return lEquals;
+       } else {
+           return false;
+       }
+   }
+ + public int hashCode() {
+       int result = 17;
+       result = PojoUtil.addHashCode(result, this.id);
+       result = PojoUtil.addHashCode(result, this.name);
+       result = PojoUtil.addHashCode(result, new Integer(this.count));
+ + return result;
+   }
+ + /**
+     * Setter is needed in RollerImpl.storePersistentObject()
+     */
+    public void setData(org.apache.roller.pojos.PersistentObject otherData)
+    {
+        SiteTagAggregateData data = (SiteTagAggregateData) otherData;
+        this.id = data.getId();
+        this.name = data.getName();
+        this.count = data.getCount();
+    }
+
+}
\ No newline at end of file

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/SiteTagAggregateData.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java?view=auto&rev=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java 
(added)
+++ 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java 
Wed Sep 27 21:38:07 2006
@@ -0,0 +1,174 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+/*
+ * Generated file - Do not edit!
+ */
+package org.apache.roller.pojos;
+
+import org.apache.roller.util.PojoUtil;
+
+
+/**
+ * @author Elias Torres
+ *
+ * @ejb:bean name="WeblogTagAggregateData"
+ * @struts.form include-all="true"
+ * @hibernate.class lazy="false" table="weblogtagagg"
+ * @hibernate.cache usage="read-write"
+ */
+public class WeblogTagAggregateData extends PersistentObject
+    implements java.io.Serializable
+{
+    private static final long serialVersionUID = -4343500268898106982L;
+    private java.lang.String id = null;
+ private java.lang.String name = null; + private WebsiteData website = null;
+    private int count = 0;
+
+    public WeblogTagAggregateData()
+    {
+    }
+
+    public WeblogTagAggregateData(java.lang.String id,
+                       WebsiteData website,
+                       java.lang.String name, int count)
+    {
+        this.id = id;
+        this.website = website;
+        this.name = name;
+        this.count = count;
+    }
+
+    public WeblogTagAggregateData(WeblogTagAggregateData otherData)
+    {
+        setData(otherData);
+    }
+
+    //------------------------------------------------------- Simple properties
+
+ /** + * Unique ID and primary key of this Referer.
+     *
+     * @hibernate.id column="id" generator-class="uuid.hex" 
unsaved-value="null"
+     */
+    public java.lang.String getId()
+    {
+        return this.id;
+    }
+
+    public void setId(java.lang.String id)
+    {
+        this.id = id;
+    }
+ + /**
+     * @roller.wrapPojoMethod type="pojo"
+     * @ejb:persistent-field
+     * @hibernate.many-to-one column="websiteid" cascade="none" not-null="true"
+     */
+    public WebsiteData getWebsite() {
+        return this.website;
+    }
+ + /** @ejb:persistent-field */
+    public void setWebsite(WebsiteData website) {
+        this.website = website;
+ } +
+    /**
+     * Tag value
+     *
+     * @roller.wrapPojoMethod type="simple"
+     * @ejb:persistent-field
+     * @hibernate.property column="name" non-null="true" unique="false"
+     */
+    public String getName() {
+        return this.name;
+    }
+    /** @ejb:persistent-field */
+    public void setName( String name ) {
+        this.name = name;
+ } + + /**
+    *
+    * @roller.wrapPojoMethod type="simple"
+    * @ejb:persistent-field
+    * @hibernate.property column="count" non-null="true" unique="false"
+    */
+   public int getCount()
+   {
+       return this.count;
+   }
+
+   /** @ejb:persistent-field */
+   public void setCount(int count)
+   {
+       this.count = count;
+ } +
+   public String toString() {
+     StringBuffer str = new StringBuffer("{");
+ + str.append("id=" + id + " " +
+             "websiteid=" + website.getId() +
+             "name=" + name + " " +
+             "count=" + count);
+     str.append('}');
+ + return (str.toString());
+ }
+ + public boolean equals(Object pOther) {
+       if (pOther instanceof WeblogTagAggregateData) {
+           WeblogTagAggregateData lTest = (WeblogTagAggregateData) pOther;
+           boolean lEquals = true;
+ + lEquals = PojoUtil.equals(lEquals, this.id, lTest.getId());
+           lEquals = PojoUtil.equals(lEquals, this.website, 
lTest.getWebsite());
+           lEquals = PojoUtil.equals(lEquals, this.name, lTest.getName());
+           lEquals = this.count == lTest.getCount();
+           return lEquals;
+       } else {
+           return false;
+       }
+   }
+ + public int hashCode() {
+       int result = 17;
+       result = PojoUtil.addHashCode(result, this.id);
+       result = PojoUtil.addHashCode(result, this.website);
+       result = PojoUtil.addHashCode(result, this.name);
+       result = PojoUtil.addHashCode(result, new Integer(this.count));
+ + return result;
+   }
+ + /**
+     * Setter is needed in RollerImpl.storePersistentObject()
+     */
+    public void setData(org.apache.roller.pojos.PersistentObject otherData)
+    {
+        WeblogTagAggregateData data = (WeblogTagAggregateData) otherData;
+        this.id = data.getId();
+        this.website = data.getWebsite();
+        this.name = data.getName();
+        this.count = data.getCount();
+    }
+
+}
\ No newline at end of file

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
incubator/roller/trunk/src/org/apache/roller/pojos/WeblogTagAggregateData.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java?view=auto&rev=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
 (added)
+++ 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
 Wed Sep 27 21:38:07 2006
@@ -0,0 +1,123 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+*  contributor license agreements.  The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.  For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+/*
+ * Created on Mar 10, 2004
+ */
+package org.apache.roller.ui.core.tasks;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.TimerTask;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.roller.RollerException;
+import org.apache.roller.model.Roller;
+import org.apache.roller.model.RollerFactory;
+import org.apache.roller.model.ScheduledTask;
+import org.apache.roller.pojos.RollerPropertyData;
+import org.apache.roller.util.DateUtil;
+
+/**
+ * Maintains tag summary information for faster response to tag UI in Roller 
weblogs.
+ * + * @author Elias Torres (<a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a>)
+ *
+ */
+public class TagSummariesTask extends TimerTask implements ScheduledTask {
+ + private static Log log = LogFactory.getLog(TagSummariesTask.class); + + private static final String LAST_RUN = "tag.summary.lastRun"; + + /**
+     * Task init.
+     */
+    public void init(Roller roller, String realPath) throws RollerException {
+        log.debug("initing");
+    }
+ + + /**
+     * Excecute the task.
+     */
+    public void run() {
+ + log.info("task started"); + + try {
+            Roller roller = RollerFactory.getRoller();
+ + // find the last time we ran
+            RollerPropertyData property = 
roller.getPropertiesManager().getProperty(LAST_RUN);
+ + Date lastRun = null; + + if (property == null)
+            {
+              // the first time we need to create a new property object
+              property = new RollerPropertyData();
+              property.setName(LAST_RUN);
+            }
+            else
+            {
+              // else, let's get last time we ran.
+              try {
+                lastRun = DateUtil.parse(property.getValue(), 
DateUtil.defaultTimestampFormat());
+              } catch (ParseException e) {
+                e.printStackTrace();
+ } + } + + Date summarized = roller.getTagManager().summarize(lastRun); + + if(summarized != null) {
+              property.setValue(DateUtil.defaultTimestamp(summarized));
+              roller.getPropertiesManager().saveProperty(property);
+              roller.flush();
+            }
+ + roller.release(); + log.info("task completed"); + + } catch (RollerException e) {
+            log.error("Error while summarizing tag table.", e);
+        } catch (Exception ee) {
+            log.error("unexpected exception", ee);
+        }
+ + log.info("task completed");
+    }
+ + + /**
+     * Main method so that this task may be run from outside the webapp.
+     */
+    public static void main(String[] args) throws Exception {
+ try { + TagSummariesTask task = new TagSummariesTask();
+            task.init(null, null);
+            task.run();
+            System.exit(0);
+        } catch (RollerException ex) {
+            ex.printStackTrace();
+            System.exit(-1);
+        }
+    }
+ +}

Propchange: 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
incubator/roller/trunk/src/org/apache/roller/ui/core/tasks/TagSummariesTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- 
incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java 
(original)
+++ 
incubator/roller/trunk/src/org/apache/roller/ui/rendering/model/SiteModel.java 
Wed Sep 27 21:38:07 2006
@@ -33,6 +33,7 @@
 import org.apache.roller.model.RefererManager;
 import org.apache.roller.model.Roller;
 import org.apache.roller.model.RollerFactory;
+import org.apache.roller.model.TagManager;
 import org.apache.roller.model.UserManager;
 import org.apache.roller.model.WeblogManager;
 import org.apache.roller.pojos.PermissionsData;
@@ -491,8 +492,8 @@
         Date startDate = cal.getTime();
try { Roller roller = RollerFactory.getRoller();
-            WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(
+            TagManager tmgr = roller.getTagManager();
+            results = tmgr.getTags(
                     startDate, new Date(), null, null, false, -1);
         } catch (Exception e) {
             log.error("ERROR: fetching site tags list", e);
@@ -513,8 +514,8 @@
         Date startDate = cal.getTime();
try { Roller roller = RollerFactory.getRoller();
-            WeblogManager wmgr = roller.getWeblogManager();
-            results = wmgr.getTags(
+            TagManager tmgr = roller.getTagManager();
+            results = tmgr.getTags(
                     startDate, new Date(), null, null, true, length);
         } catch (Exception e) {
             log.error("ERROR: fetching site tags list", e);

Modified: incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml (original)
+++ incubator/roller/trunk/testdata/WEB-INF/classes/hibernate.cfg.xml Wed Sep 
27 21:38:07 2006
@@ -65,7 +65,9 @@
         <mapping resource="org/apache/roller/pojos/RefererData.hbm.xml" />
<mapping resource="org/apache/roller/pojos/WeblogEntryData.hbm.xml" /> - <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/WeblogEntryTagData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/WeblogTagAggregateData.hbm.xml" /> + <mapping resource="org/apache/roller/pojos/SiteTagAggregateData.hbm.xml" /> <mapping resource="org/apache/roller/pojos/EntryAttributeData.hbm.xml" />
         <mapping resource="org/apache/roller/pojos/WeblogCategoryData.hbm.xml" 
/>
         <mapping resource="org/apache/roller/pojos/WeblogCategoryAssoc.hbm.xml" 
/>

Modified: incubator/roller/trunk/web/WEB-INF/classes/roller.properties
URL: 
http://svn.apache.org/viewvc/incubator/roller/trunk/web/WEB-INF/classes/roller.properties?view=diff&rev=450690&r1=450689&r2=450690
==============================================================================
--- incubator/roller/trunk/web/WEB-INF/classes/roller.properties (original)
+++ incubator/roller/trunk/web/WEB-INF/classes/roller.properties Wed Sep 27 
21:38:07 2006
@@ -241,7 +241,7 @@
 #,org.apache.roller.ui.core.tasks.SyncWebsitesTask
# Comma separated list of task classnames to be executed hourly
-tasks.hourly=\
+tasks.hourly=org.apache.roller.ui.core.tasks.TagSummariesTask\
# Hourly Planet task: refresh latest entry list from all weblogs in list
 #org.apache.roller.ui.core.tasks.RefreshEntriesTask


Reply via email to