Revision 76da16c3 snf-pithos-backend/pithos/backends/lib/sqlalchemy/node.py

b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/node.py
1079 1079

  
1080 1080
        v = self.versions.alias('v')
1081 1081
        n = self.nodes.alias('n')
1082
        if not all_props:
1083
            s = select([n.c.path, v.c.serial]).distinct()
1084
        else:
1085
            s = select([n.c.path,
1086
                        v.c.serial, v.c.node, v.c.hash,
1087
                        v.c.size, v.c.type, v.c.source,
1088
                        v.c.mtime, v.c.muser, v.c.uuid,
1089
                        v.c.checksum, v.c.cluster]).distinct()
1090 1082
        if before != inf:
1091 1083
            filtered = select([func.max(self.versions.c.serial)])
1092 1084
            filtered = filtered.where(self.versions.c.mtime < before)
1085
            inner_join = \
1086
                    self.nodes.join(self.versions,
1087
                            onclause=self.versions.c.serial==filtered)
1093 1088
        else:
1094 1089
            filtered = select([self.nodes.c.latest_version])
1095
        s = s.where(
1096
            v.c.serial == filtered.where(self.nodes.c.node == v.c.node))
1097
        s = s.where(v.c.cluster != except_cluster)
1098
        s = s.where(v.c.node.in_(select([self.nodes.c.node],
1090
            inner_join = \
1091
                    self.nodes.join(self.versions,
1092
                            onclause=\
1093
                            self.versions.c.serial==self.nodes.c.latest_version)
1094
        if not all_props:
1095
            s = select([self.nodes.c.path,
1096
                self.versions.c.serial],from_obj=[inner_join]).distinct()
1097
        else:
1098
            s = select([self.nodes.c.path,
1099
                        self.versions.c.serial, self.versions.c.node,
1100
                        self.versions.c.hash,
1101
                        self.versions.c.size, self.versions.c.type,
1102
                        self.versions.c.source,
1103
                        self.versions.c.mtime, self.versions.c.muser,
1104
                        self.versions.c.uuid,
1105
                        self.versions.c.checksum,
1106
                        self.versions.c.cluster],from_obj=[inner_join]).distinct()
1107

  
1108
        s = s.where(self.versions.c.cluster != except_cluster)
1109
        s = s.where(self.versions.c.node.in_(select([self.nodes.c.node],
1099 1110
                                        self.nodes.c.parent == parent)))
1100 1111

  
1101
        s = s.where(n.c.node == v.c.node)
1102
        s = s.where(and_(n.c.path > bindparam('start'), n.c.path < nextling))
1112
        s = s.where(self.versions.c.node == self.versions.c.node)
1113
        s = s.where(and_(self.nodes.c.path > bindparam('start'), self.nodes.c.path < nextling))
1103 1114
        conj = []
1104 1115
        for path, match in pathq:
1105 1116
            if match == MATCH_PREFIX:
1106
                conj.append(n.c.path.like(self.escape_like(path) + '%',
1117
                conj.append(self.nodes.c.path.like(self.escape_like(path) + '%',
1107 1118
                                          escape=ESCAPE_CHAR))
1108 1119
            elif match == MATCH_EXACT:
1109
                conj.append(n.c.path == path)
1120
                conj.append(self.nodes.c.path == path)
1110 1121
        if conj:
1111 1122
            s = s.where(or_(*conj))
1112 1123

  
1113 1124
        if sizeq and len(sizeq) == 2:
1114 1125
            if sizeq[0]:
1115
                s = s.where(v.c.size >= sizeq[0])
1126
                s = s.where(self.versions.c.size >= sizeq[0])
1116 1127
            if sizeq[1]:
1117
                s = s.where(v.c.size < sizeq[1])
1128
                s = s.where(self.versions.c.size < sizeq[1])
1118 1129

  
1119 1130
        if domain and filterq:
1120 1131
            a = self.attributes.alias('a')
......
1140 1151
                        and_(a.c.key.op('=')(k), a.c.value.op(o)(val)))
1141 1152
                    s = s.where(exists(subs))
1142 1153

  
1143
        s = s.order_by(n.c.path)
1154
        s = s.order_by(self.nodes.c.path)
1144 1155

  
1145 1156
        if not delimiter:
1146 1157
            s = s.limit(limit)

Also available in: Unified diff