def getNoAccessIds(attr, trans):
     lstNoAccess = []
     for sID in attr.value:
         oItem = dbEnv.getItem(sID, trans)
         # do not replay in case of txn abort
         del trans.actions[-1]
         
         if not(oItem):
             lstNoAccess.append(sID)
     return lstNoAccess
 def getParent(self, trans=None):
     """
     Returns the parent container.
             
     @param trans: A valid transaction handle
         
     @return: the parent container object
     @rtype: type
     """
     return(dbEnv.getItem(self._parentid, trans))
 def getChildByName(self, name, trans=None):
     """
     This method returns the child with the specified name.
     
     @param name: The name of the child
     @type name: str
     
     @param trans: A valid transaction handle
         
     @return: The child object if a child with the given name exists
              else None.
     @rtype: type
     """
     if (self._items.has_key(name)):
         oChild = dbEnv.getItem(self._items[name], trans)
         return(oChild)
     elif (self._subfolders.has_key(name)):
         oChild = dbEnv.getItem(self._subfolders[name], trans)
         return(oChild)
     else:
         return(None)
 def getItem(self, trans=None):
     """
     This method returns the object that this data type
     instance references. If the current user has no read
     permission on the referenced item then it returns None.
     
     @param trans: A valid transaction handle
     
     @rtype: type
     @return: The referenced object, otherwise None
     """
     if self.value:
         return(dbEnv.getItem(self.value, trans))
     return(None)
 def getSubFolders(self, trans=None):
     """
     This method returns the children that are containers.
     
     @param trans: A valid transaction handle
         
     @rtype: L{ObjectSet<porcupine.core.objectSet.ObjectSet>}
     """
     lstFolders = self._subfolders.values()
     subFolders = []
     for sID in lstFolders:
         oChild = dbEnv.getItem(sID)
         if oChild:
             subFolders.append(oChild)
     return(objectSet.ObjectSet(subFolders))
 def getItems(self, trans=None):
     """
     This method returns the children that are not containers.
     
     @param trans: A valid transaction handle
     
     @rtype: L{ObjectSet<porcupine.core.objectSet.ObjectSet>}
     """
     lstItems = self._items.values()
     items = []
     for sID in lstItems:
         oChild = dbEnv.getItem(sID, trans)
         if oChild:
             items.append(oChild)
     return(objectSet.ObjectSet(items))
 def getItems(self, trans=None):
     """
     This method returns the items that this data type
     instance references.
     
     @param trans: A valid transaction handle
     
     @rtype: L{ObjectSet<porcupine.core.objectSet.ObjectSet>}
     """
     lstItems = []
     for sID in self.value:
         oItem = dbEnv.getItem(sID, trans)
         if oItem:
             lstItems.append(oItem)
     return(objectSet.ObjectSet(lstItems))
 def getItem(self, trans=None):
     """
     This method returns the object that this data type
     instance references. If the current user has no read
     permission on the referenced item or it has been deleted
     then it returns None.
     
     @param trans: A valid transaction handle
     
     @rtype: type
     @return: The referenced object, otherwise None
     """
     oItem = None
     if self.value:
         try:
             oItem = dbEnv.getItem(self.value, trans)
         except serverExceptions.DBItemNotFound:
             pass
     return(oItem)
def select(deep, children, fields, condition, variables):
    results = []
    
    for child in [dbEnv.getItem(child_id) for child_id in children]:
        if child:
            if condition:
                res = evaluateStack(condition[:], variables, child)
            else:
                res = True
            
            if res:
                fieldlist = [evaluateStack(expr[1], variables, child) for expr in fields]
                results.append(tuple(fieldlist))
                
            if deep and child.isCollection:
                children_ids = child._subfolders.values() + child._items.values()
                results1 = select(deep, children_ids, fields, condition, variables)
                results.extend(results1)

    return (results)
def h_200(params, variables, forObject = None):
    select_fields = params[0]
    
    # get aliases
    aliases = []
    for expr, alias, aggr in select_fields:
        if expr != alias:
            variables[alias] = (expr, None, None)
            aliases.append(alias)

    field_names = [ x[1] for x in select_fields ]
    expressions = [ tuple(x[0::2]) for x in select_fields ]
    
    select_from = params[1]
    where_condition = params[2]
    
    if params[3]:
        sort_order, order_by = params[3]
        
        for ind, order_field in enumerate(order_by):
            expr, alias, aggr = order_field
            if alias in aliases:
                order_by[ind] = select_fields[ field_names.index(alias) ]
            elif expr != alias:
                if (expr, aggr) in expressions:
                    order_by[ind] = select_fields[ expressions.index((expr, aggr)) ]
#                    print 'caching expression: ' + repr(order_by[ind])
                else:
                    variables[alias] = (expr, None, None)
                    aliases.append(alias)
    else:
        order_by = []

    group_by = params[4]
    if group_by:
        for ind, group_field in enumerate(group_by):
            expr, alias, aggr = group_field
            if alias in aliases:
                group_by[ind] = select_fields[ field_names.index(alias) ]
            elif expr != alias:
                if (expr, aggr) in expressions:
                    group_by[ind] = select_fields[ expressions.index((expr, aggr)) ]
#                    print 'caching expression: ' + repr(group_by[ind])
                else:
                    variables[alias] = (expr, None, None)
                    aliases.append(alias)

    if select_fields:
        all_fields = select_fields + order_by + group_by
    else:
        all_fields = [['id','id', '']] + order_by + group_by
    
    aggregates = [x[2] for x in all_fields]
    results = []
    
    for deep, object_id in select_from:
        if deep==2:
            # this.attr
            if not forObject:
                raise TypeError, 'Inner scopes using "this:" are valid only in subqueries'
            if hasattr(forObject, object_id):
                refObjects = getattr(forObject, object_id).value
                r = select(0, refObjects, all_fields, where_condition, variables)
                results.extend(r)
        else:
            # swallow-deep
            obj = dbEnv.getItem(object_id)    
            if obj and obj.isCollection:
                children = obj._subfolders.values() + obj._items.values()
                r = select(deep, children, all_fields, 
                                where_condition, variables)
                results.extend(r)
#    print results
    if results:
        if group_by:
            if select_fields:
                #construct groups
                group_dict = {}
                igrpstart = len(select_fields) + len(order_by)
                igrpend = igrpstart + len(group_by)
                for rec in results:
                    group_value = tuple(rec[igrpstart:igrpend])
                    group_dict[group_value] = group_dict.setdefault(group_value, [])
                    group_dict[group_value].append(rec)
                groups = [tuple(g) for g in group_dict.values()]
            else:
                raise TypeError, 'GROUP BY clause is incompatible with SELECT *'
        else:
            groups = [results]
        
#        print len(groups)
        results = []

        if aggregates != [''] * len(aggregates) or group_by:
            for ind, group in enumerate(groups):
                group_sum = []
                for aggr_index, aggr_type in enumerate(aggregates):
                    # aggregates exclude None values
                    group_sum.append( computeAggregate(aggr_type, [x[aggr_index] for x in group if x[aggr_index] != None]) )
                groups[ind] = (tuple(group_sum),)

        for group in groups:
            results.extend(group)

        if order_by:
            # extract sort values
            istart = 1
            if select_fields:
                istart = len(select_fields)
            sortlist = tuple([x[istart:istart + len(order_by)] for x in results])
            results = sortList(sortlist, results)
            # if it is descending reverse the result list
            if not sort_order: results.reverse()
    
    # remove aliases
    for alias in aliases:
        del variables[alias]
    
    if select_fields:
        schema = field_names
        # truncate to keep only select fields
        iend = len(select_fields)
        results = tuple([x[:iend] for x in results])
    else:
        schema = None
        results = tuple([x[:1][0] for x in results])
        
#    print results

    return objectSet.ObjectSet(tuple(results), schema)