Elias Torres wrote:

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?

Actually we only need 2. The usertagagg is not going to be used. The
reason is that if we have n unique tags and m sites, then queries for a
site tag cloud would be against a table n x m rows long vs n rows long.
Weblog tagclouds can be answered quickly from the weblogtagagg table by
simply restricting the rows by websiteid and taking every row. But the
site tagcloud from the same table would require reading the entire
table. This might not be a big deal, if you guys think is overkill, one
could do.

I don't care if you keep a seperate record for the site-wide and individual weblog aggregate data, but I think we can keep it all in one table right? Basically, the site-wide version for a tag is a weblogtagagg row with websiteid = NULL.

So the query for hot tags site-wide would be something like ...

select * from weblogtaggagg where websiteid = NULL order by cnt;



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?

This is a very good question and I'll gladly change it if we have a
better option. However, I'm not sure if we can do it correctly. Let me
explain. If we have a new entry using an existent tag and I make a query
to get its current count and then increment it with one won't I have
problems with the way hibernate works? I'd think that I would be
clobbering values as multiple requests are coming for the same tag since
we are not "locking" the table and calling flush() at different stages
in the code. I used a task approach to make sure I wouldn't lose any
values and that we could easily recompute the aggregate table through an
admin setting if needed.

I think the likelihood of that is very slim. Since the data is getting updated at entry publish time then the only chance for that to occur is if 2 or more people are posting their entry at the exact same time and using the exact same tags. Even then I would expect Hibernate to account for that.

We do a far more impacting version of that same thing with the way the current ReferrerManager works for counting referrers throughout the day. That thing works the same way ... select RefererData, update cnt, save. And it does that on every single request to a weblog, so it's far more likely that we would get a collision problem there on a high volume site then with the tag agg cnt.

The other problem I see with doing it as a task is that then the data isn't kept as fresh and you are spending a lot of extra time iterating over every single tag and recomputing its count. I think I would prefer if we try and stick with the original plan first and update the aggregate data when the entry is actually saved.



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

I was chatting with Dave yesterday and initially wrote the sumarizing
code directly to hibernate but I then noticed that I needed to abstract
that. I asked which one he preferred: new interface or add them to the
same one. He leaned towards a new one, but I can shove them into
WeblogManager.

I don't follow that at all. Maybe you can start by explaining what that method is for and why we need it, it's not documented in the code.



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.

I have set my IDE to convert tabs to spaces and using 2 spaces for each
tab. Maybe I need to change my settings. Sorry.

It looks like it was code that you copied and pasted and probably didn't reformat. It's not that big of a deal, but it's definitely nice if everyone can keep their code formatted nicely when adding it to the repository so it doesn't have to be cleaned up later.

-- Allen



-Elias

-- 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