Another thing that I just noticed is that I am getting an exception now when I try using a weblog url that specifies a locale ...

ERROR 2006-09-28 12:13:50,017 ErrorCounter:reportError - line 1:119: unexpected token: lower ERROR 2006-09-28 12:13:50,019 WeblogEntriesLatestPager:getEntries - ERROR: getting entry month map
java.lang.reflect.UndeclaredThrowableException
        at $Proxy0.createQuery(Unknown Source)
at org.apache.roller.business.hibernate.HibernateWeblogManagerImpl.getWeblogEntries(HibernateWeblogManagerImpl.java:479) at org.apache.roller.business.hibernate.HibernateWeblogManagerImpl.getWeblogEntryMap(HibernateWeblogManagerImpl.java:1039) at org.apache.roller.business.hibernate.HibernateWeblogManagerImpl.getWeblogEntryObjectMap(HibernateWeblogManagerImpl.java:986) at org.apache.roller.ui.rendering.pagers.WeblogEntriesLatestPager.getEntries(WeblogEntriesLatestPager.java:78) at org.apache.roller.ui.rendering.pagers.WeblogEntriesLatestPager.<init>(WeblogEntriesLatestPager.java:67) at org.apache.roller.ui.rendering.model.PageModel.getWeblogEntriesPager(PageModel.java:225) at org.apache.roller.ui.rendering.model.PageModel.getWeblogEntriesPager(PageModel.java:244)


In general I am getting a little bit uneasy about how we've gone from using the Criteria api to the HQL query for that method. This is twice now that I've caught problems with the way HQL was used. Was there really no way to continue using the old Criteria api way?

-- Allen



Allen Gilliland wrote:
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