commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r8457 - trunk/gnue-appserver/src


From: reinhard
Subject: [gnue] r8457 - trunk/gnue-appserver/src
Date: Fri, 12 May 2006 16:34:43 -0500 (CDT)

Author: reinhard
Date: 2006-05-12 16:34:42 -0500 (Fri, 12 May 2006)
New Revision: 8457

Modified:
   trunk/gnue-appserver/src/data.py
Log:
Further optimization, introduced iterator support in data.recordset.


Modified: trunk/gnue-appserver/src/data.py
===================================================================
--- trunk/gnue-appserver/src/data.py    2006-05-12 17:17:21 UTC (rev 8456)
+++ trunk/gnue-appserver/src/data.py    2006-05-12 21:34:42 UTC (rev 8457)
@@ -118,7 +118,7 @@
         it will change the clean cache.
     """
 
-    key = "%s-%s" % (table, row)
+    key = table + u'-' + row
 
     # If we add 'clean' data there is no need to maintain an undo sequence
     if not dirty:
@@ -128,7 +128,7 @@
       # transaction support.
       if not crow.has_key (field):
         crow [field] = value
-        state = self.__state.setdefault (key, 'clean')
+        self.__state.setdefault (key, 'clean')
 
     else:
       # If there is no backup of the record right now, we have to create one
@@ -1221,13 +1221,14 @@
     self.__add     = []
     self.__added   = 0
     self.__remove  = {}
-    self.__mergeWithCache (conditions, order)
+    self.__mergeWithCache (conditions)
 
     self.__current   = None
     self.__resultSet = _createResultSet (self.__connections, self.__database,
                                          self.__content, conditions, order)
     self.__rawdata = self.__resultSet.raw()
 
+
   # ---------------------------------------------------------------------------
   # Return the number of records
   # ---------------------------------------------------------------------------
@@ -1242,6 +1243,45 @@
 
 
   # ---------------------------------------------------------------------------
+  # Iterator
+  # ---------------------------------------------------------------------------
+
+  def __iter__ (self):
+
+      # next uncommmitted new record to be inserted between the records read
+      # from the backend
+      if self.__add:
+          next_add = SortRecord(self.__add[0],
+                  self.__getSortSequence(self.__add[0]))
+      else:
+          next_add = None
+
+      for backend_record in [self.__buildRecords(r) for r in self.__rawdata]:
+
+          # if there are any uncommitted new records, insert them at the
+          # correct position
+          if next_add is not None:
+              gnue_id = backend_record._row
+              while next_add < SortRecord(gnue_id,
+                      self.__getSortSequence(gnue_id)):
+                  self.__add.pop(0)
+                  self.__added += 1
+                  yield record(self.__cache, self.__connections,
+                          self.__database, self.__getMasterTable(), next_add)
+                  if self.__add:
+                      next_add = SortRecord(self.__add[0],
+                              self.__getSortSequence(self.__add[0]))
+                  else:
+                      next_add = None
+
+          # don't yield records that have been deleted in uncommitted deletes
+          if self.__remove.has_key(backend_record._row):
+              continue
+
+          yield backend_record
+
+
+  # ---------------------------------------------------------------------------
   # Return the next record
   # ---------------------------------------------------------------------------
 
@@ -1272,8 +1312,8 @@
 
         if rec is not None:
           rid   = rec.getField (u'gnue_id')
-          left  = SortRecord (row, self.__getSortSequence (row, self.__order))
-          right = SortRecord (rid, self.__getSortSequence (rid, self.__order))
+          left  = SortRecord (row, self.__getSortSequence (row))
+          right = SortRecord (rid, self.__getSortSequence (rid))
 
           useAdd = cmp (left, right) <= 0
         else:
@@ -1371,7 +1411,7 @@
         return None
 
     # Now, have a look if the instance has to be removed
-    if self.__remove.has_key (self.__current.getRow ()):
+    if self.__remove.has_key (self.__current._row):
       self.__current = None
       res = self.__nextBackendRecord ()
 
@@ -1402,7 +1442,7 @@
   # Merge cache 
   # ---------------------------------------------------------------------------
 
-  def __mergeWithCache (self, conditions, order):
+  def __mergeWithCache (self, conditions):
     """
     """
 
@@ -1432,7 +1472,7 @@
           self.__removeFilter (row, conditions)
         else:
           # otherwise we have to analyze the sort order
-          if self.__sortOrderChanged (row, order):
+          if self.__sortOrderChanged (row):
             # if the sortorder has changed we remove it from the old position
             # and insert it at the new one
             self.__remove [row] = True
@@ -1445,8 +1485,8 @@
 
     # If we have a sort order defined, we need to sort all records listed for
     # addition
-    if order and len (self.__add):
-      self.__sortAddition (order)
+    if self.__order and len (self.__add):
+      self.__sortAddition ()
 
 
   # ---------------------------------------------------------------------------
@@ -1568,7 +1608,7 @@
   # Check wether a field in the sort order has changed or not
   # ---------------------------------------------------------------------------
 
-  def __sortOrderChanged (self, row, order):
+  def __sortOrderChanged (self, row):
     """
     This function checks if a field in the sort order has been changed.
 
@@ -1577,7 +1617,7 @@
     @return: True if a field has been changed, False otherwise
     """
     
-    for field in [f ['name'] for f in order]:
+    for field in [f ['name'] for f in self.__order]:
       path = self.__getPropertyPath (field)
       if self.__fieldIsChanged (row, path):
         return True
@@ -1651,7 +1691,7 @@
   # Sort all records which we have to merge in
   # ---------------------------------------------------------------------------
 
-  def __sortAddition (self, order):
+  def __sortAddition (self):
     """
     This function sorts all records from the cache to fit the current sort
     order.
@@ -1661,7 +1701,7 @@
     if len (self.__add) > 1:
       seq = []
       for row in self.__add:
-        seq.append (SortRecord (row, self.__getSortSequence (row, order)))
+        seq.append (SortRecord (row, self.__getSortSequence (row)))
 
       seq.sort ()
       self.__add = [item.row for item in seq]
@@ -1671,7 +1711,7 @@
   # Create a sort sequence for a sort order and a given record
   # ---------------------------------------------------------------------------
 
-  def __getSortSequence (self, row, order):
+  def __getSortSequence (self, row):
     """
     This function creates a sequence of tuples (fieldvalue, direction) for the
     record specified by 'row' using the given sortorder.
@@ -1684,7 +1724,7 @@
     result = []
     append = result.append
 
-    for element in order:
+    for element in self.__order:
       field      = element ['name']
       direction  = element.get ('descending') or False
       ignorecase = element.get ('ignorecase') or False
@@ -1729,23 +1769,15 @@
     self.__connections = connections
     self.__database    = database
     self.__table       = table
-    self.__row         = row
-    self.__backend     = None
 
+    # performance note:
+    # we make this directly accessible because that's faster than get_row()
+    self._row          = row
 
-  # ---------------------------------------------------------------------------
-  # Get the gnue_id of the record
-  # ---------------------------------------------------------------------------
+    # backend database connection
+    self.__backend     = None
 
-  def getRow (self):
-    """
-    Return the current row-id of this record
-    @return: row id of this record instance
-    """
 
-    return self.__row
-
-
   # ---------------------------------------------------------------------------
   # Cache a single value for this record
   # ---------------------------------------------------------------------------
@@ -1758,7 +1790,7 @@
     @param value: value of the field
     """
 
-    self.__cache.write (self.__table, self.__row, field, value, False)
+    self.__cache.write (self.__table, self._row, field, value, False)
 
 
   # ---------------------------------------------------------------------------
@@ -1778,7 +1810,7 @@
     for field in fields:
       f = alias and (alias + '.' + field) or field
 
-      self.__cache.write (self.__table, self.__row, field, RecordSet [f], 
False)
+      self.__cache.write (self.__table, self._row, field, RecordSet [f], False)
 
 
   # ---------------------------------------------------------------------------
@@ -1807,7 +1839,7 @@
     # First try to return the value from the cache. Just trying it and ignoring
     # a KeyError exception is much faster than first checking if it exists.
     try:
-      return self.__cache.read (self.__table, self.__row, field, not original)
+      return self.__cache.read (self.__table, self._row, field, not original)
     except KeyError:
       pass
 
@@ -1821,11 +1853,11 @@
     if self.__backend is None:
       self.__backend = self.__connections.getConnection (self.__database, True)
 
-    new = self.__backend.requery (self.__table, {u'gnue_id': self.__row},
+    new = self.__backend.requery (self.__table, {u'gnue_id': self._row},
                                      [field])
     if new:
       value = new.get (field)
-      self.__cache.write (self.__table, self.__row, field, value, False)
+      self.__cache.write (self.__table, self._row, field, value, False)
     else:
       value = None
 
@@ -1849,7 +1881,7 @@
 
     checktype (field, unicode)
 
-    self.__cache.write (self.__table, self.__row, field, value, True)
+    self.__cache.write (self.__table, self._row, field, value, True)
 
 
   # ---------------------------------------------------------------------------
@@ -1865,7 +1897,7 @@
         another state than 'initializing'.
     """
 
-    self.__cache.initialized (self.__table, self.__row)
+    self.__cache.initialized (self.__table, self._row)
 
 
   # ---------------------------------------------------------------------------
@@ -1888,7 +1920,7 @@
     @return: current state of the record
     """
 
-    return self.__cache.state (self.__table, self.__row)
+    return self.__cache.state (self.__table, self._row)
 
 
   # ---------------------------------------------------------------------------
@@ -1901,7 +1933,7 @@
     instance.
     """
 
-    return "<record of table '%s', row '%s'>" % (self.__table, self.__row)
+    return "<record of table '%s', row '%s'>" % (self.__table, self._row)
       
 
 # =============================================================================





reply via email to

[Prev in Thread] Current Thread [Next in Thread]