I have spent a lot of time over the past few months standardizing the Summon and WorldCat modules of VuFind to behave similarly to (and share code with) the standard Solr-based VuFind search module.  However, there is one area that gets very tricky: dealing with user-entered metadata like tags and favorites.  I am hoping to get some input on how this should be handled.


The good news: the database already supports associating user-entered metadata with objects from different modules.


The bad news: actually displaying this data to the user gets complicated.


Suppose a user adds two Solr items, three Summon items, and four WorldCat items to a single list.  I can think of two approaches for displaying the list:


1.) Show a tab for each module and force the user to switch tabs to see results.  This is probably the easiest solution to code, but it's ugly for the user, who may not know or care about distinctions between the different data sources.

2.) Show a single list combining all of the entries.  This seems like the ideal solution, but details like sort order become a problem -- you either have to do some complicated work to merge and sort all the lists (even messier when pagination gets involved), or you have to sacrifice some fundamental functionality (i.e. force lists to display in the order the metadata was created and disallow custom sorts).


A similar issue comes up with Tag searching -- if a user searches for a tag, do we want that search to apply across all modules?  If so, how?  Perhaps it would make sense to actually create a "Tag" module that does this meta-search…  but this would bring up the same display issues as the favorite lists.


One thought I've had is to implement "record drivers" for Summon and WorldCat to abstract all the record display logic through the same interface as the Solr records.  This would make it easier to do things like displaying a mixed result list…  but it doesn't solve problems like the sort order issue, and perhaps it's excessive abstraction.


Has anybody else given any thought to this issue?  Any suggestions?