Revision 62d938dc pithos/backends/lib/sqlalchemy/node.py

b/pithos/backends/lib/sqlalchemy/node.py
39 39

  
40 40
from dbworker import DBWorker
41 41

  
42
ROOTNODE  = 0
42
ROOTNODE  = 1
43 43

  
44 44
( SERIAL, NODE, HASH, SIZE, SOURCE, MTIME, MUSER, CLUSTER ) = range(8)
45 45

  
......
117 117
        columns.append(Column('path', String(2048), default='', nullable=False))
118 118
        self.nodes = Table('nodes', metadata, *columns)
119 119
        # place an index on path
120
        Index('idx_nodes_path', self.nodes.c.path, unique=True)
120
        Index('idx_nodes_path', self.nodes.c.path)
121 121
        
122 122
        #create statistics table
123 123
        columns=[]
......
255 255
        c1 = select([self.nodes.c.node],
256 256
            self.nodes.c.parent == parent)
257 257
        where_clause = and_(self.versions.c.node.in_(c1),
258
                            self.versions.c.cluster == cluster,
259
                            self.versions.c.mtime <= before)
258
                            self.versions.c.cluster == cluster)
260 259
        s = select([func.count(self.versions.c.serial),
261 260
                    func.sum(self.versions.c.size)])
262 261
        s = s.where(where_clause)
262
        if before != inf:
263
            s = s.where(self.versions.c.mtime <= before)
263 264
        r = self.conn.execute(s)
264 265
        row = r.fetchone()
265 266
        r.close()
......
305 306
        s = select([func.count(self.versions.c.serial),
306 307
                    func.sum(self.versions.c.size)])
307 308
        where_clause = and_(self.versions.c.node == node,
308
                         self.versions.c.cluster == cluster,
309
                         self.versions.c.mtime <= before)
309
                         self.versions.c.cluster == cluster)
310 310
        s = s.where(where_clause)
311
        if before != inf:
312
            s = s.where(self.versions.c.mtime <= before)
311 313
        r = self.conn.execute(s)
312 314
        row = r.fetchone()
313 315
        nr, size = row[0], row[1]
......
450 452
                    self.versions.c.mtime,
451 453
                    self.versions.c.muser,
452 454
                    self.versions.c.cluster])
455
        filtered = select([func.max(self.versions.c.serial)],
456
                            self.versions.c.node == node)
457
        if before != inf:
458
            filtered = filtered.where(self.versions.c.mtime < before)
453 459
        s = s.where(and_(self.versions.c.cluster != except_cluster,
454
                         self.versions.c.serial == select(
455
                            [func.max(self.versions.c.serial)],
456
                            and_(self.versions.c.node == node,
457
                            self.versions.c.mtime < before))))
460
                         self.versions.c.serial == filtered))
458 461
        r = self.conn.execute(s)
459 462
        props = r.fetchone()
460 463
        r.close()
......
467 470
        s = select([func.count(v.c.serial),
468 471
                    func.sum(v.c.size),
469 472
                    func.max(v.c.mtime)])
470
        c1 = select([func.max(self.versions.c.serial)],
471
            and_(self.versions.c.node == v.c.node,
472
                 self.versions.c.mtime < before))
473
        c1 = select([func.max(self.versions.c.serial)])
474
        if before != inf:
475
            c1 = c1.where(self.versions.c.mtime < before)
473 476
        c2 = select([self.nodes.c.node], self.nodes.c.parent == node)
474
        s = s.where(and_(v.c.serial == c1,
477
        s = s.where(and_(v.c.serial == c1.where(self.versions.c.node == v.c.node),
475 478
                         v.c.cluster != except_cluster,
476 479
                         v.c.node.in_(c2)))
477 480
        rp = self.conn.execute(s)
......
490 493
                    func.sum(v.c.size),
491 494
                    func.max(v.c.mtime)])
492 495
        c1 = select([func.max(self.versions.c.serial)],
493
            and_(self.versions.c.node == v.c.node,
494
                 self.versions.c.mtime < before))
496
            self.versions.c.node == v.c.node)
497
        if before != inf:
498
            c1 = c1.where(self.versions.c.mtime < before)
495 499
        c2 = select([self.nodes.c.node], self.nodes.c.path.like(path + '%'))
496 500
        s = s.where(and_(v.c.serial == c1,
497 501
                         v.c.cluster != except_cluster,
......
528 532
        s = select([v.c.serial, v.c.node, v.c.hash, v.c.size,
529 533
                    v.c.source, v.c.mtime, v.c.muser, v.c.cluster])
530 534
        c = select([func.max(self.versions.c.serial)],
531
            and_(self.versions.c.node == node,
532
                 self.versions.c.mtime < before))
535
            self.versions.c.node == node)
536
        if before != inf:
537
            c = c.where(self.versions.c.mtime < before)
533 538
        s = s.where(and_(v.c.serial == c,
534 539
                         v.c.cluster == cluster))
535 540
        r = self.conn.execute(s)
......
682 687
        v = self.versions.alias('v')
683 688
        n = self.nodes.alias('n')
684 689
        s = select([a.c.key]).distinct()
685
        s = s.where(v.c.serial == select([func.max(self.versions.c.serial)],
686
                                          and_(self.versions.c.node == v.c.node,
687
                                               self.versions.c.mtime < before)))
690
        filtered = select([func.max(self.versions.c.serial)])
691
        if before != inf:
692
            filtered = filtered.where(self.versions.c.mtime < before)
693
        s = s.where(v.c.serial == filtered.where(self.versions.c.node == v.c.node))
688 694
        s = s.where(v.c.cluster != except_cluster)
689 695
        s = s.where(v.c.node.in_(select([self.nodes.c.node],
690 696
            self.nodes.c.parent == parent)))
......
757 763
        v = self.versions.alias('v')
758 764
        n = self.nodes.alias('n')
759 765
        s = select([n.c.path, v.c.serial]).distinct()
760
        s = s.where(v.c.serial == select([func.max(self.versions.c.serial)],
761
            and_(self.versions.c.node == v.c.node,
762
                 self.versions.c.mtime < before)))
766
        filtered = select([func.max(self.versions.c.serial)])
767
        if before != inf:
768
            filtered = filtered.where(self.versions.c.mtime < before)
769
        s = s.where(v.c.serial == filtered.where(self.versions.c.node == v.c.node))
763 770
        s = s.where(v.c.cluster != except_cluster)
764 771
        s = s.where(v.c.node.in_(select([self.nodes.c.node],
765 772
            self.nodes.c.parent == parent)))

Also available in: Unified diff