You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@roller.apache.org by Mitesh Meswani <Mi...@Sun.COM> on 2006/10/04 23:48:07 UTC
Question about code in HibernateUserManagerImpl
Hi,
I am working (along with Craig) on developing a persistence layer
abstraction for roller. While converting the code, I had following
questions about code in HibernateUserManagerImpl#removeWebsiteContents()
1. The list queueEntries is retrieved but not used.
I think the intention would have been to remove the queueEntries
from database is that correct?
2. All the removals below (For example removing of auto ping
configurations) can be replaced by bulk deletes.
That is deleting directly from database instead of getting them into
memory and than deleting.I saw
HibernateRefererManagerImpl#clearReferrers using the "bulk
delete" pattern. Is there any reason
(apart from historic code) why "bulk delete" is not used here ?
Thanks,
Mitesh
<code_Of_the_method_for_quick_referece>
private void removeWebsiteContents(WebsiteData website)
throws HibernateException, RollerException {
Session session = this.strategy.getSession();
BookmarkManager bmgr =
RollerFactory.getRoller().getBookmarkManager();
WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
// Remove the website's ping queue entries
Criteria criteria =
session.createCriteria(PingQueueEntryData.class);
criteria.add(Expression.eq("website", website));
List queueEntries = criteria.list(); *<--------1*
// Remove the website's auto ping configurations *<------ 2.*
AutoPingManager autoPingMgr =
RollerFactory.getRoller().getAutopingManager();
List autopings = autoPingMgr.getAutoPingsByWebsite(website);
Iterator it = autopings.iterator();
while(it.hasNext()) {
this.strategy.remove((AutoPingData) it.next());
}
// Remove the website's custom ping targets
PingTargetManager pingTargetMgr =
RollerFactory.getRoller().getPingTargetManager();
List pingtargets = pingTargetMgr.getCustomPingTargets(website);
it = pingtargets.iterator();
while(it.hasNext()) {
this.strategy.remove((PingTargetData) it.next());
}
// remove entries
Criteria entryQuery = session.createCriteria(WeblogEntryData.class);
entryQuery.add(Expression.eq("website", website));
List entries = entryQuery.list();
for (Iterator iter = entries.iterator(); iter.hasNext();) {
WeblogEntryData entry = (WeblogEntryData) iter.next();
this.strategy.remove(entry);
}
// remove associated referers
Criteria refererQuery = session.createCriteria(RefererData.class);
refererQuery.add(Expression.eq("website", website));
List referers = refererQuery.list();
for (Iterator iter = referers.iterator(); iter.hasNext();) {
RefererData referer = (RefererData) iter.next();
this.strategy.remove(referer);
}
// remove associated pages
Criteria pageQuery = session.createCriteria(WeblogTemplate.class);
pageQuery.add(Expression.eq("website", website));
List pages = pageQuery.list();
for (Iterator iter = pages.iterator(); iter.hasNext();) {
WeblogTemplate page = (WeblogTemplate) iter.next();
this.strategy.remove(page);
}
// remove folders (including bookmarks)
FolderData rootFolder = bmgr.getRootFolder(website);
if (null != rootFolder) {
this.strategy.remove(rootFolder);
// Still cannot get all Bookmarks cleared!
Iterator allFolders = bmgr.getAllFolders(website).iterator();
while (allFolders.hasNext()) {
FolderData aFolder = (FolderData)allFolders.next();
bmgr.removeFolderContents(aFolder);
this.strategy.remove(aFolder);
}
}
// remove categories
WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
if (null != rootCat) {
this.strategy.remove(rootCat);
}
}
</code_Of_the_method_for_quick_referece>
Re: Question about code in HibernateUserManagerImpl
Posted by Allen Gilliland <al...@sun.com>.
Mitesh Meswani wrote:
>
>
> Anil Gangolli wrote:
>> Inline. Maybe Allen can comment too?
>>
>> ----- Original Message ----- From: "Mitesh Meswani"
>> <Mi...@Sun.COM>
>> To: <ro...@incubator.apache.org>
>> Sent: Wednesday, October 04, 2006 2:48 PM
>> Subject: Question about code in HibernateUserManagerImpl
>>
>>
>>> Hi,
>>>
>>> I am working (along with Craig) on developing a persistence layer
>>> abstraction for roller. While converting the code, I had following
>>> questions about code in HibernateUserManagerImpl#removeWebsiteContents()
>>>
>>> 1. The list queueEntries is retrieved but not used.
>>> I think the intention would have been to remove the queueEntries
>>> from database is that correct?
>>
>> Yes; it seems incomplete.
>>
>> Removing the website's custom ping target will remove the associated
>> queue
>> entries, but you can have queue entries from common ping targets as
>> well, so
>> this is probably good to do.
> If it is ok to not delete queue entries here we should either the
> unnecessary database access to fetch queueEntries. I will remove the
> entries in DatamapperUserManagerImpl.
yes, that method should actually be deleting those queue entries, so
that is a mistake in the current code.
>>
>>> 2. All the removals below (For example removing of auto ping
>>> configurations) can be replaced by bulk deletes.
>>> That is deleting directly from database instead of getting them into
>>> memory and than deleting.I saw
>>> HibernateRefererManagerImpl#clearReferrers using the "bulk
>>> delete" pattern. Is there any reason
>>> (apart from historic code) why "bulk delete" is not used here ?
>>>
>>
>> I think you just have to be careful that the object's manager doesn't
>> itself
>> have some cascading delete logic that expects to be called whenever an
>> object it manages is removed.
>>
>> It seems to me that the current pattern for handling cascading
>> deletion in
>> the managers seems to expect this; that is, the bulk deletion shortcut
>> can
>> only be used (safely) if it is in the manager that manages that object
>> type directly.
> Good point. I think than it makes sense to use current pattern.
I would agree that bulk deletes probably makes more sense, but as Anil
suggested it may not always be safe to do so. I think it's fine to
stick with the current pattern, that's not really a performance
sensitive operation anyways.
-- Allen
>
> Thanks,
> Mitesh
>>
>> --a.
>>
>>
>>> Thanks,
>>> Mitesh
>>>
>>>
>>> <code_Of_the_method_for_quick_referece>
>>>
>>> private void removeWebsiteContents(WebsiteData website)
>>> throws HibernateException, RollerException {
>>>
>>> Session session = this.strategy.getSession();
>>>
>>> BookmarkManager bmgr =
>>> RollerFactory.getRoller().getBookmarkManager();
>>> WeblogManager wmgr =
>>> RollerFactory.getRoller().getWeblogManager();
>>>
>>> // Remove the website's ping queue entries
>>> Criteria criteria =
>>> session.createCriteria(PingQueueEntryData.class);
>>> criteria.add(Expression.eq("website", website));
>>> List queueEntries = criteria.list(); *<--------1*
>>>
>>> // Remove the website's auto ping configurations *<------ 2.*
>>> AutoPingManager autoPingMgr =
>>> RollerFactory.getRoller().getAutopingManager();
>>> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
>>> Iterator it = autopings.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((AutoPingData) it.next());
>>> }
>>>
>>> // Remove the website's custom ping targets
>>> PingTargetManager pingTargetMgr =
>>> RollerFactory.getRoller().getPingTargetManager();
>>> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
>>> it = pingtargets.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((PingTargetData) it.next());
>>> }
>>>
>>> // remove entries
>>> Criteria entryQuery =
>>> session.createCriteria(WeblogEntryData.class);
>>> entryQuery.add(Expression.eq("website", website));
>>> List entries = entryQuery.list();
>>> for (Iterator iter = entries.iterator(); iter.hasNext();) {
>>> WeblogEntryData entry = (WeblogEntryData) iter.next();
>>>
>>> this.strategy.remove(entry);
>>> }
>>>
>>> // remove associated referers
>>> Criteria refererQuery =
>>> session.createCriteria(RefererData.class);
>>> refererQuery.add(Expression.eq("website", website));
>>> List referers = refererQuery.list();
>>> for (Iterator iter = referers.iterator(); iter.hasNext();) {
>>> RefererData referer = (RefererData) iter.next();
>>> this.strategy.remove(referer);
>>> }
>>>
>>>
>>> // remove associated pages
>>> Criteria pageQuery =
>>> session.createCriteria(WeblogTemplate.class);
>>> pageQuery.add(Expression.eq("website", website));
>>> List pages = pageQuery.list();
>>> for (Iterator iter = pages.iterator(); iter.hasNext();) {
>>> WeblogTemplate page = (WeblogTemplate) iter.next();
>>> this.strategy.remove(page);
>>> }
>>>
>>> // remove folders (including bookmarks)
>>> FolderData rootFolder = bmgr.getRootFolder(website);
>>> if (null != rootFolder) {
>>> this.strategy.remove(rootFolder);
>>>
>>> // Still cannot get all Bookmarks cleared!
>>> Iterator allFolders = bmgr.getAllFolders(website).iterator();
>>> while (allFolders.hasNext()) {
>>> FolderData aFolder = (FolderData)allFolders.next();
>>> bmgr.removeFolderContents(aFolder);
>>> this.strategy.remove(aFolder);
>>> }
>>> }
>>>
>>> // remove categories
>>> WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
>>> if (null != rootCat) {
>>> this.strategy.remove(rootCat);
>>> }
>>>
>>> }
>>>
>>>
>>> </code_Of_the_method_for_quick_referece>
>>>
>>
Re: Question about code in HibernateUserManagerImpl
Posted by Mitesh Meswani <Mi...@Sun.COM>.
Anil Gangolli wrote:
>
> Mitesh. Sorry I was not clear. I meant that we should be removing
> the queue entries. That function should ideally be performed by
> calling the PinqQueueManager and implementing the removal there in a
> new method to remove all queue entries by website. That method could
> be implemented with a bulk delete.
>
> If that's too much of a detour, you could defer that and just fix it
> locally by adding the individual remove call in the code you showed.
I want the code in Datamapper*ManagerImpl to be as similar as possible
to Hibernate*MangerImpl for the first pass. So, I will go with the
current code pattern for now (deleting using individual remove call). I
have a note in the code to start using bulk deletes from respective
managers when this code stabilizes.
Thanks,
Mitesh
> --a
>
>
>
> ----- Original Message ----- From: "Mitesh Meswani"
> <Mi...@Sun.COM>
> To: <ro...@incubator.apache.org>
> Sent: Thursday, October 05, 2006 9:32 AM
> Subject: Re: Question about code in HibernateUserManagerImpl
>
>
>>
>>
>> Anil Gangolli wrote:
>>> Inline. Maybe Allen can comment too?
>>>
>>> ----- Original Message ----- From: "Mitesh Meswani"
>>> <Mi...@Sun.COM>
>>> To: <ro...@incubator.apache.org>
>>> Sent: Wednesday, October 04, 2006 2:48 PM
>>> Subject: Question about code in HibernateUserManagerImpl
>>>
>>>
>>>> Hi,
>>>>
>>>> I am working (along with Craig) on developing a persistence layer
>>>> abstraction for roller. While converting the code, I had following
>>>> questions about code in
>>>> HibernateUserManagerImpl#removeWebsiteContents()
>>>>
>>>> 1. The list queueEntries is retrieved but not used.
>>>> I think the intention would have been to remove the queueEntries
>>>> from database is that correct?
>>>
>>> Yes; it seems incomplete.
>>>
>>> Removing the website's custom ping target will remove the associated
>>> queue
>>> entries, but you can have queue entries from common ping targets as
>>> well, so
>>> this is probably good to do.
>> If it is ok to not delete queue entries here we should either the
>> unnecessary database access to fetch queueEntries. I will remove the
>> entries in DatamapperUserManagerImpl.
>>>
>>>> 2. All the removals below (For example removing of auto ping
>>>> configurations) can be replaced by bulk deletes.
>>>> That is deleting directly from database instead of getting them
>>>> into
>>>> memory and than deleting.I saw
>>>> HibernateRefererManagerImpl#clearReferrers using the "bulk
>>>> delete" pattern. Is there any reason
>>>> (apart from historic code) why "bulk delete" is not used here ?
>>>>
>>>
>>> I think you just have to be careful that the object's manager
>>> doesn't itself
>>> have some cascading delete logic that expects to be called whenever an
>>> object it manages is removed.
>>>
>>> It seems to me that the current pattern for handling cascading
>>> deletion in
>>> the managers seems to expect this; that is, the bulk deletion
>>> shortcut can
>>> only be used (safely) if it is in the manager that manages that
>>> object type directly.
>> Good point. I think than it makes sense to use current pattern.
>>
>> Thanks,
>> Mitesh
>>>
>>> --a.
>>>
>>>
>>>> Thanks,
>>>> Mitesh
>>>>
>>>>
>>>> <code_Of_the_method_for_quick_referece>
>>>>
>>>> private void removeWebsiteContents(WebsiteData website)
>>>> throws HibernateException, RollerException {
>>>>
>>>> Session session = this.strategy.getSession();
>>>>
>>>> BookmarkManager bmgr =
>>>> RollerFactory.getRoller().getBookmarkManager();
>>>> WeblogManager wmgr =
>>>> RollerFactory.getRoller().getWeblogManager();
>>>>
>>>> // Remove the website's ping queue entries
>>>> Criteria criteria =
>>>> session.createCriteria(PingQueueEntryData.class);
>>>> criteria.add(Expression.eq("website", website));
>>>> List queueEntries = criteria.list(); *<--------1*
>>>>
>>>> // Remove the website's auto ping configurations *<------ 2.*
>>>> AutoPingManager autoPingMgr =
>>>> RollerFactory.getRoller().getAutopingManager();
>>>> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
>>>> Iterator it = autopings.iterator();
>>>> while(it.hasNext()) {
>>>> this.strategy.remove((AutoPingData) it.next());
>>>> }
>>>>
>>>> // Remove the website's custom ping targets
>>>> PingTargetManager pingTargetMgr =
>>>> RollerFactory.getRoller().getPingTargetManager();
>>>> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
>>>> it = pingtargets.iterator();
>>>> while(it.hasNext()) {
>>>> this.strategy.remove((PingTargetData) it.next());
>>>> }
>>>>
>>>> // remove entries
>>>> Criteria entryQuery =
>>>> session.createCriteria(WeblogEntryData.class);
>>>> entryQuery.add(Expression.eq("website", website));
>>>> List entries = entryQuery.list();
>>>> for (Iterator iter = entries.iterator(); iter.hasNext();) {
>>>> WeblogEntryData entry = (WeblogEntryData) iter.next();
>>>>
>>>> this.strategy.remove(entry);
>>>> }
>>>>
>>>> // remove associated referers
>>>> Criteria refererQuery =
>>>> session.createCriteria(RefererData.class);
>>>> refererQuery.add(Expression.eq("website", website));
>>>> List referers = refererQuery.list();
>>>> for (Iterator iter = referers.iterator(); iter.hasNext();) {
>>>> RefererData referer = (RefererData) iter.next();
>>>> this.strategy.remove(referer);
>>>> }
>>>>
>>>>
>>>> // remove associated pages
>>>> Criteria pageQuery =
>>>> session.createCriteria(WeblogTemplate.class);
>>>> pageQuery.add(Expression.eq("website", website));
>>>> List pages = pageQuery.list();
>>>> for (Iterator iter = pages.iterator(); iter.hasNext();) {
>>>> WeblogTemplate page = (WeblogTemplate) iter.next();
>>>> this.strategy.remove(page);
>>>> }
>>>>
>>>> // remove folders (including bookmarks)
>>>> FolderData rootFolder = bmgr.getRootFolder(website);
>>>> if (null != rootFolder) {
>>>> this.strategy.remove(rootFolder);
>>>>
>>>> // Still cannot get all Bookmarks cleared!
>>>> Iterator allFolders =
>>>> bmgr.getAllFolders(website).iterator();
>>>> while (allFolders.hasNext()) {
>>>> FolderData aFolder = (FolderData)allFolders.next();
>>>> bmgr.removeFolderContents(aFolder);
>>>> this.strategy.remove(aFolder);
>>>> }
>>>> }
>>>>
>>>> // remove categories
>>>> WeblogCategoryData rootCat =
>>>> wmgr.getRootWeblogCategory(website);
>>>> if (null != rootCat) {
>>>> this.strategy.remove(rootCat);
>>>> }
>>>>
>>>> }
>>>>
>>>>
>>>> </code_Of_the_method_for_quick_referece>
>>>>
>>>
>>
>
Re: Question about code in HibernateUserManagerImpl
Posted by Anil Gangolli <an...@busybuddha.org>.
Mitesh. Sorry I was not clear. I meant that we should be removing the
queue entries. That function should ideally be performed by calling the
PinqQueueManager and implementing the removal there in a new method to
remove all queue entries by website. That method could be implemented with
a bulk delete.
If that's too much of a detour, you could defer that and just fix it locally
by adding the individual remove call in the code you showed.
--a
----- Original Message -----
From: "Mitesh Meswani" <Mi...@Sun.COM>
To: <ro...@incubator.apache.org>
Sent: Thursday, October 05, 2006 9:32 AM
Subject: Re: Question about code in HibernateUserManagerImpl
>
>
> Anil Gangolli wrote:
>> Inline. Maybe Allen can comment too?
>>
>> ----- Original Message ----- From: "Mitesh Meswani"
>> <Mi...@Sun.COM>
>> To: <ro...@incubator.apache.org>
>> Sent: Wednesday, October 04, 2006 2:48 PM
>> Subject: Question about code in HibernateUserManagerImpl
>>
>>
>>> Hi,
>>>
>>> I am working (along with Craig) on developing a persistence layer
>>> abstraction for roller. While converting the code, I had following
>>> questions about code in HibernateUserManagerImpl#removeWebsiteContents()
>>>
>>> 1. The list queueEntries is retrieved but not used.
>>> I think the intention would have been to remove the queueEntries
>>> from database is that correct?
>>
>> Yes; it seems incomplete.
>>
>> Removing the website's custom ping target will remove the associated
>> queue
>> entries, but you can have queue entries from common ping targets as well,
>> so
>> this is probably good to do.
> If it is ok to not delete queue entries here we should either the
> unnecessary database access to fetch queueEntries. I will remove the
> entries in DatamapperUserManagerImpl.
>>
>>> 2. All the removals below (For example removing of auto ping
>>> configurations) can be replaced by bulk deletes.
>>> That is deleting directly from database instead of getting them into
>>> memory and than deleting.I saw
>>> HibernateRefererManagerImpl#clearReferrers using the "bulk
>>> delete" pattern. Is there any reason
>>> (apart from historic code) why "bulk delete" is not used here ?
>>>
>>
>> I think you just have to be careful that the object's manager doesn't
>> itself
>> have some cascading delete logic that expects to be called whenever an
>> object it manages is removed.
>>
>> It seems to me that the current pattern for handling cascading deletion
>> in
>> the managers seems to expect this; that is, the bulk deletion shortcut
>> can
>> only be used (safely) if it is in the manager that manages that object
>> type directly.
> Good point. I think than it makes sense to use current pattern.
>
> Thanks,
> Mitesh
>>
>> --a.
>>
>>
>>> Thanks,
>>> Mitesh
>>>
>>>
>>> <code_Of_the_method_for_quick_referece>
>>>
>>> private void removeWebsiteContents(WebsiteData website)
>>> throws HibernateException, RollerException {
>>>
>>> Session session = this.strategy.getSession();
>>>
>>> BookmarkManager bmgr =
>>> RollerFactory.getRoller().getBookmarkManager();
>>> WeblogManager wmgr =
>>> RollerFactory.getRoller().getWeblogManager();
>>>
>>> // Remove the website's ping queue entries
>>> Criteria criteria =
>>> session.createCriteria(PingQueueEntryData.class);
>>> criteria.add(Expression.eq("website", website));
>>> List queueEntries = criteria.list(); *<--------1*
>>>
>>> // Remove the website's auto ping configurations *<------ 2.*
>>> AutoPingManager autoPingMgr =
>>> RollerFactory.getRoller().getAutopingManager();
>>> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
>>> Iterator it = autopings.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((AutoPingData) it.next());
>>> }
>>>
>>> // Remove the website's custom ping targets
>>> PingTargetManager pingTargetMgr =
>>> RollerFactory.getRoller().getPingTargetManager();
>>> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
>>> it = pingtargets.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((PingTargetData) it.next());
>>> }
>>>
>>> // remove entries
>>> Criteria entryQuery =
>>> session.createCriteria(WeblogEntryData.class);
>>> entryQuery.add(Expression.eq("website", website));
>>> List entries = entryQuery.list();
>>> for (Iterator iter = entries.iterator(); iter.hasNext();) {
>>> WeblogEntryData entry = (WeblogEntryData) iter.next();
>>>
>>> this.strategy.remove(entry);
>>> }
>>>
>>> // remove associated referers
>>> Criteria refererQuery =
>>> session.createCriteria(RefererData.class);
>>> refererQuery.add(Expression.eq("website", website));
>>> List referers = refererQuery.list();
>>> for (Iterator iter = referers.iterator(); iter.hasNext();) {
>>> RefererData referer = (RefererData) iter.next();
>>> this.strategy.remove(referer);
>>> }
>>>
>>>
>>> // remove associated pages
>>> Criteria pageQuery =
>>> session.createCriteria(WeblogTemplate.class);
>>> pageQuery.add(Expression.eq("website", website));
>>> List pages = pageQuery.list();
>>> for (Iterator iter = pages.iterator(); iter.hasNext();) {
>>> WeblogTemplate page = (WeblogTemplate) iter.next();
>>> this.strategy.remove(page);
>>> }
>>>
>>> // remove folders (including bookmarks)
>>> FolderData rootFolder = bmgr.getRootFolder(website);
>>> if (null != rootFolder) {
>>> this.strategy.remove(rootFolder);
>>>
>>> // Still cannot get all Bookmarks cleared!
>>> Iterator allFolders = bmgr.getAllFolders(website).iterator();
>>> while (allFolders.hasNext()) {
>>> FolderData aFolder = (FolderData)allFolders.next();
>>> bmgr.removeFolderContents(aFolder);
>>> this.strategy.remove(aFolder);
>>> }
>>> }
>>>
>>> // remove categories
>>> WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
>>> if (null != rootCat) {
>>> this.strategy.remove(rootCat);
>>> }
>>>
>>> }
>>>
>>>
>>> </code_Of_the_method_for_quick_referece>
>>>
>>
>
Re: Question about code in HibernateUserManagerImpl
Posted by Mitesh Meswani <Mi...@Sun.COM>.
Hit the send button too soon...
Mitesh Meswani wrote:
>
>
> Anil Gangolli wrote:
>> Inline. Maybe Allen can comment too?
>>
>> ----- Original Message ----- From: "Mitesh Meswani"
>> <Mi...@Sun.COM>
>> To: <ro...@incubator.apache.org>
>> Sent: Wednesday, October 04, 2006 2:48 PM
>> Subject: Question about code in HibernateUserManagerImpl
>>
>>
>>> Hi,
>>>
>>> I am working (along with Craig) on developing a persistence layer
>>> abstraction for roller. While converting the code, I had following
>>> questions about code in
>>> HibernateUserManagerImpl#removeWebsiteContents()
>>>
>>> 1. The list queueEntries is retrieved but not used.
>>> I think the intention would have been to remove the queueEntries
>>> from database is that correct?
>>
>> Yes; it seems incomplete.
>>
>> Removing the website's custom ping target will remove the associated
>> queue
>> entries, but you can have queue entries from common ping targets as
>> well, so
>> this is probably good to do.
> If it is ok to not delete queue entries here we should either the
> unnecessary database access to fetch queueEntries. I will remove the
> entries in DatamapperUserManagerImpl.
Meant to say....
If it is ok to not delete queue entries while removing a website, we
should avoid the unnecessary database access to fetch queueEntries in
HibernateUserManagerImpl.
I will delete the queue entries in DatamapperUserManagerImpl.
Thanks,
Mitesh
>>
>>> 2. All the removals below (For example removing of auto ping
>>> configurations) can be replaced by bulk deletes.
>>> That is deleting directly from database instead of getting them into
>>> memory and than deleting.I saw
>>> HibernateRefererManagerImpl#clearReferrers using the "bulk
>>> delete" pattern. Is there any reason
>>> (apart from historic code) why "bulk delete" is not used here ?
>>>
>>
>> I think you just have to be careful that the object's manager doesn't
>> itself
>> have some cascading delete logic that expects to be called whenever an
>> object it manages is removed.
>>
>> It seems to me that the current pattern for handling cascading
>> deletion in
>> the managers seems to expect this; that is, the bulk deletion
>> shortcut can
>> only be used (safely) if it is in the manager that manages that
>> object type directly.
> Good point. I think than it makes sense to use current pattern.
>
> Thanks,
> Mitesh
>>
>> --a.
>>
>>
>>> Thanks,
>>> Mitesh
>>>
>>>
>>> <code_Of_the_method_for_quick_referece>
>>>
>>> private void removeWebsiteContents(WebsiteData website)
>>> throws HibernateException, RollerException {
>>>
>>> Session session = this.strategy.getSession();
>>>
>>> BookmarkManager bmgr =
>>> RollerFactory.getRoller().getBookmarkManager();
>>> WeblogManager wmgr =
>>> RollerFactory.getRoller().getWeblogManager();
>>>
>>> // Remove the website's ping queue entries
>>> Criteria criteria =
>>> session.createCriteria(PingQueueEntryData.class);
>>> criteria.add(Expression.eq("website", website));
>>> List queueEntries = criteria.list(); *<--------1*
>>>
>>> // Remove the website's auto ping configurations *<------ 2.*
>>> AutoPingManager autoPingMgr =
>>> RollerFactory.getRoller().getAutopingManager();
>>> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
>>> Iterator it = autopings.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((AutoPingData) it.next());
>>> }
>>>
>>> // Remove the website's custom ping targets
>>> PingTargetManager pingTargetMgr =
>>> RollerFactory.getRoller().getPingTargetManager();
>>> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
>>> it = pingtargets.iterator();
>>> while(it.hasNext()) {
>>> this.strategy.remove((PingTargetData) it.next());
>>> }
>>>
>>> // remove entries
>>> Criteria entryQuery =
>>> session.createCriteria(WeblogEntryData.class);
>>> entryQuery.add(Expression.eq("website", website));
>>> List entries = entryQuery.list();
>>> for (Iterator iter = entries.iterator(); iter.hasNext();) {
>>> WeblogEntryData entry = (WeblogEntryData) iter.next();
>>>
>>> this.strategy.remove(entry);
>>> }
>>>
>>> // remove associated referers
>>> Criteria refererQuery =
>>> session.createCriteria(RefererData.class);
>>> refererQuery.add(Expression.eq("website", website));
>>> List referers = refererQuery.list();
>>> for (Iterator iter = referers.iterator(); iter.hasNext();) {
>>> RefererData referer = (RefererData) iter.next();
>>> this.strategy.remove(referer);
>>> }
>>>
>>>
>>> // remove associated pages
>>> Criteria pageQuery =
>>> session.createCriteria(WeblogTemplate.class);
>>> pageQuery.add(Expression.eq("website", website));
>>> List pages = pageQuery.list();
>>> for (Iterator iter = pages.iterator(); iter.hasNext();) {
>>> WeblogTemplate page = (WeblogTemplate) iter.next();
>>> this.strategy.remove(page);
>>> }
>>>
>>> // remove folders (including bookmarks)
>>> FolderData rootFolder = bmgr.getRootFolder(website);
>>> if (null != rootFolder) {
>>> this.strategy.remove(rootFolder);
>>>
>>> // Still cannot get all Bookmarks cleared!
>>> Iterator allFolders =
>>> bmgr.getAllFolders(website).iterator();
>>> while (allFolders.hasNext()) {
>>> FolderData aFolder = (FolderData)allFolders.next();
>>> bmgr.removeFolderContents(aFolder);
>>> this.strategy.remove(aFolder);
>>> }
>>> }
>>>
>>> // remove categories
>>> WeblogCategoryData rootCat =
>>> wmgr.getRootWeblogCategory(website);
>>> if (null != rootCat) {
>>> this.strategy.remove(rootCat);
>>> }
>>>
>>> }
>>>
>>>
>>> </code_Of_the_method_for_quick_referece>
>>>
>>
Re: Question about code in HibernateUserManagerImpl
Posted by Mitesh Meswani <Mi...@Sun.COM>.
Anil Gangolli wrote:
> Inline. Maybe Allen can comment too?
>
> ----- Original Message ----- From: "Mitesh Meswani"
> <Mi...@Sun.COM>
> To: <ro...@incubator.apache.org>
> Sent: Wednesday, October 04, 2006 2:48 PM
> Subject: Question about code in HibernateUserManagerImpl
>
>
>> Hi,
>>
>> I am working (along with Craig) on developing a persistence layer
>> abstraction for roller. While converting the code, I had following
>> questions about code in HibernateUserManagerImpl#removeWebsiteContents()
>>
>> 1. The list queueEntries is retrieved but not used.
>> I think the intention would have been to remove the queueEntries
>> from database is that correct?
>
> Yes; it seems incomplete.
>
> Removing the website's custom ping target will remove the associated
> queue
> entries, but you can have queue entries from common ping targets as
> well, so
> this is probably good to do.
If it is ok to not delete queue entries here we should either the
unnecessary database access to fetch queueEntries. I will remove the
entries in DatamapperUserManagerImpl.
>
>> 2. All the removals below (For example removing of auto ping
>> configurations) can be replaced by bulk deletes.
>> That is deleting directly from database instead of getting them into
>> memory and than deleting.I saw
>> HibernateRefererManagerImpl#clearReferrers using the "bulk
>> delete" pattern. Is there any reason
>> (apart from historic code) why "bulk delete" is not used here ?
>>
>
> I think you just have to be careful that the object's manager doesn't
> itself
> have some cascading delete logic that expects to be called whenever an
> object it manages is removed.
>
> It seems to me that the current pattern for handling cascading
> deletion in
> the managers seems to expect this; that is, the bulk deletion shortcut
> can
> only be used (safely) if it is in the manager that manages that object
> type directly.
Good point. I think than it makes sense to use current pattern.
Thanks,
Mitesh
>
> --a.
>
>
>> Thanks,
>> Mitesh
>>
>>
>> <code_Of_the_method_for_quick_referece>
>>
>> private void removeWebsiteContents(WebsiteData website)
>> throws HibernateException, RollerException {
>>
>> Session session = this.strategy.getSession();
>>
>> BookmarkManager bmgr =
>> RollerFactory.getRoller().getBookmarkManager();
>> WeblogManager wmgr =
>> RollerFactory.getRoller().getWeblogManager();
>>
>> // Remove the website's ping queue entries
>> Criteria criteria =
>> session.createCriteria(PingQueueEntryData.class);
>> criteria.add(Expression.eq("website", website));
>> List queueEntries = criteria.list(); *<--------1*
>>
>> // Remove the website's auto ping configurations *<------ 2.*
>> AutoPingManager autoPingMgr =
>> RollerFactory.getRoller().getAutopingManager();
>> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
>> Iterator it = autopings.iterator();
>> while(it.hasNext()) {
>> this.strategy.remove((AutoPingData) it.next());
>> }
>>
>> // Remove the website's custom ping targets
>> PingTargetManager pingTargetMgr =
>> RollerFactory.getRoller().getPingTargetManager();
>> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
>> it = pingtargets.iterator();
>> while(it.hasNext()) {
>> this.strategy.remove((PingTargetData) it.next());
>> }
>>
>> // remove entries
>> Criteria entryQuery =
>> session.createCriteria(WeblogEntryData.class);
>> entryQuery.add(Expression.eq("website", website));
>> List entries = entryQuery.list();
>> for (Iterator iter = entries.iterator(); iter.hasNext();) {
>> WeblogEntryData entry = (WeblogEntryData) iter.next();
>>
>> this.strategy.remove(entry);
>> }
>>
>> // remove associated referers
>> Criteria refererQuery =
>> session.createCriteria(RefererData.class);
>> refererQuery.add(Expression.eq("website", website));
>> List referers = refererQuery.list();
>> for (Iterator iter = referers.iterator(); iter.hasNext();) {
>> RefererData referer = (RefererData) iter.next();
>> this.strategy.remove(referer);
>> }
>>
>>
>> // remove associated pages
>> Criteria pageQuery =
>> session.createCriteria(WeblogTemplate.class);
>> pageQuery.add(Expression.eq("website", website));
>> List pages = pageQuery.list();
>> for (Iterator iter = pages.iterator(); iter.hasNext();) {
>> WeblogTemplate page = (WeblogTemplate) iter.next();
>> this.strategy.remove(page);
>> }
>>
>> // remove folders (including bookmarks)
>> FolderData rootFolder = bmgr.getRootFolder(website);
>> if (null != rootFolder) {
>> this.strategy.remove(rootFolder);
>>
>> // Still cannot get all Bookmarks cleared!
>> Iterator allFolders = bmgr.getAllFolders(website).iterator();
>> while (allFolders.hasNext()) {
>> FolderData aFolder = (FolderData)allFolders.next();
>> bmgr.removeFolderContents(aFolder);
>> this.strategy.remove(aFolder);
>> }
>> }
>>
>> // remove categories
>> WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
>> if (null != rootCat) {
>> this.strategy.remove(rootCat);
>> }
>>
>> }
>>
>>
>> </code_Of_the_method_for_quick_referece>
>>
>
Re: Question about code in HibernateUserManagerImpl
Posted by Anil Gangolli <an...@busybuddha.org>.
Inline. Maybe Allen can comment too?
----- Original Message -----
From: "Mitesh Meswani" <Mi...@Sun.COM>
To: <ro...@incubator.apache.org>
Sent: Wednesday, October 04, 2006 2:48 PM
Subject: Question about code in HibernateUserManagerImpl
> Hi,
>
> I am working (along with Craig) on developing a persistence layer
> abstraction for roller. While converting the code, I had following
> questions about code in HibernateUserManagerImpl#removeWebsiteContents()
>
> 1. The list queueEntries is retrieved but not used.
> I think the intention would have been to remove the queueEntries
> from database is that correct?
Yes; it seems incomplete.
Removing the website's custom ping target will remove the associated queue
entries, but you can have queue entries from common ping targets as well, so
this is probably good to do.
> 2. All the removals below (For example removing of auto ping
> configurations) can be replaced by bulk deletes.
> That is deleting directly from database instead of getting them into
> memory and than deleting.I saw
> HibernateRefererManagerImpl#clearReferrers using the "bulk
> delete" pattern. Is there any reason
> (apart from historic code) why "bulk delete" is not used here ?
>
I think you just have to be careful that the object's manager doesn't itself
have some cascading delete logic that expects to be called whenever an
object it manages is removed.
It seems to me that the current pattern for handling cascading deletion in
the managers seems to expect this; that is, the bulk deletion shortcut can
only be used (safely) if it is in the manager that manages that object type
directly.
--a.
> Thanks,
> Mitesh
>
>
> <code_Of_the_method_for_quick_referece>
>
> private void removeWebsiteContents(WebsiteData website)
> throws HibernateException, RollerException {
>
> Session session = this.strategy.getSession();
>
> BookmarkManager bmgr =
> RollerFactory.getRoller().getBookmarkManager();
> WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
>
> // Remove the website's ping queue entries
> Criteria criteria =
> session.createCriteria(PingQueueEntryData.class);
> criteria.add(Expression.eq("website", website));
> List queueEntries = criteria.list(); *<--------1*
>
> // Remove the website's auto ping configurations *<------ 2.*
> AutoPingManager autoPingMgr =
> RollerFactory.getRoller().getAutopingManager();
> List autopings = autoPingMgr.getAutoPingsByWebsite(website);
> Iterator it = autopings.iterator();
> while(it.hasNext()) {
> this.strategy.remove((AutoPingData) it.next());
> }
>
> // Remove the website's custom ping targets
> PingTargetManager pingTargetMgr =
> RollerFactory.getRoller().getPingTargetManager();
> List pingtargets = pingTargetMgr.getCustomPingTargets(website);
> it = pingtargets.iterator();
> while(it.hasNext()) {
> this.strategy.remove((PingTargetData) it.next());
> }
>
> // remove entries
> Criteria entryQuery =
> session.createCriteria(WeblogEntryData.class);
> entryQuery.add(Expression.eq("website", website));
> List entries = entryQuery.list();
> for (Iterator iter = entries.iterator(); iter.hasNext();) {
> WeblogEntryData entry = (WeblogEntryData) iter.next();
>
> this.strategy.remove(entry);
> }
>
> // remove associated referers
> Criteria refererQuery = session.createCriteria(RefererData.class);
> refererQuery.add(Expression.eq("website", website));
> List referers = refererQuery.list();
> for (Iterator iter = referers.iterator(); iter.hasNext();) {
> RefererData referer = (RefererData) iter.next();
> this.strategy.remove(referer);
> }
>
>
> // remove associated pages
> Criteria pageQuery = session.createCriteria(WeblogTemplate.class);
> pageQuery.add(Expression.eq("website", website));
> List pages = pageQuery.list();
> for (Iterator iter = pages.iterator(); iter.hasNext();) {
> WeblogTemplate page = (WeblogTemplate) iter.next();
> this.strategy.remove(page);
> }
>
> // remove folders (including bookmarks)
> FolderData rootFolder = bmgr.getRootFolder(website);
> if (null != rootFolder) {
> this.strategy.remove(rootFolder);
>
> // Still cannot get all Bookmarks cleared!
> Iterator allFolders = bmgr.getAllFolders(website).iterator();
> while (allFolders.hasNext()) {
> FolderData aFolder = (FolderData)allFolders.next();
> bmgr.removeFolderContents(aFolder);
> this.strategy.remove(aFolder);
> }
> }
>
> // remove categories
> WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
> if (null != rootCat) {
> this.strategy.remove(rootCat);
> }
>
> }
>
>
> </code_Of_the_method_for_quick_referece>
>