Re: difficult object relational mapping

Joshua Paine <[email protected]> Wed, 05 Mar 2008 23:07:23 -0500
Newsgroups gmane.comp.java.helma.general
Message-ID <[email protected]>
Maksim Lin for technical support mailling lists wrote:
> function getEventsByRecentChanges() {
> 	var sqlResult =
> helma.Database.getInstance("MyDataSource").query("SELECT ID from ...);
> 	var resultList = [];
> 	for (var i=0; i < sqlResults.length; i++) {
> 		resultList.push( Event.getById(sqlResult.[i].ID) );
> 	}
> 	return resultList;
> }

This is worse than what Breton suggested because it loads every Event in 
the DB into memory all at once. For the original poster I still favor a 
way to use the provided collections feature.

We could improve on your sample code, though, to get something at least 
as fast that only loads the entire list of IDs into memory at once. 
(That's still too much in some cases, but this will work in more cases 
than the sample above.) Also make it generic and act a bit like a 
HopObject collection:

function createOrderedView(hopType,dataSourceName,query) {
   /* query must select ID */
   var rx = /^\s*[Ss][Ee][Ll][Ee][Cc][Tt]\s+(\w+\s+(as\s+)?)?ID,?\s/;
   if(!rx.test(query)) return null;
   var sqlResults = helma.Database.getInstance(dataSourceName)
                    .query(query);
   var pub = ({
     get : function(i) {
       if(!sqlResults[i]) return null;
       return hopType.getById(sqlResults[i].ID);
     },
     size : function() {
       return sqlResults.length;
     },
     list : function() {
       var l = [];
       for(var i = 0; i < sqlResults.length; i++) l[i] = pub.get(i);
     }
   });
   return pub;
}

This code has not been run. Fixing any errors is left as an exercise to 
the reader ;-).