Package Pyblio :: Module Sort
[hide private]
[frames] | no frames]

Source Code for Module Pyblio.Sort

 1  # This file is part of pybliographer 
 2  #  
 3  # Copyright (C) 1998-2006 Frederic GOBRY 
 4  # Email : gobry@pybliographer.org 
 5  #           
 6  # This program is free software; you can redistribute it and/or 
 7  # modify it under the terms of the GNU General Public License 
 8  # as published by the Free Software Foundation; either version 2  
 9  # of the License, or (at your option) any later version. 
10  #    
11  # This program is distributed in the hope that it will be useful, 
12  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
14  # GNU General Public License for more details.  
15  #  
16  # You should have received a copy of the GNU General Public License 
17  # along with this program; if not, write to the Free Software 
18  # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
19   
20  """ 
21  Definition of the sort language. 
22   
23  Sorting according to fields A (ascending) and B (descending) can be 
24  written:: 
25   
26   OrderBy ('A') & OrderBy ('B', asc = False) 
27   
28  """ 
29   
30   
31 -def compare (a, b):
32 33 for (sa, va), (sb, vb) in zip (a, b): 34 r = cmp (va, vb) 35 if r: return r * sa 36 37 return 0
38
39 -class _Base (object):
40
41 - def __and__ (self, other):
42 return _Seq (self, other)
43 44
45 -class _Seq (_Base):
46
47 - def __init__ (self, a, b):
48 self.a = a 49 self.b = b 50 return
51
52 - def cmp_key (self, rec):
53 return self.a.cmp_key (rec) + self.b.cmp_key (rec)
54 55
56 -class OrderBy (_Base):
57
58 - def __init__ (self, field, asc = True):
59 60 self.field = field 61 62 if asc: self.asc = +1 63 else: self.asc = -1 64 return
65
66 - def cmp_key (self, rec):
67 68 try: 69 parts = [ x.sort () for x in rec [self.field] ] 70 71 except KeyError: 72 parts = [] 73 74 return (self.asc, parts),
75