interactive-mining/interactive-mining-3rdparty.../madis/src/functions/aggregate/partialsort.py

72 lines
1.5 KiB
Python
Executable File

import functions
import operator
class partialsort:
"""
.. function:: partialsort(n,col1,col2,col3,....)
sorts the first n columns of its input
:Returned multiset schema:
Columns are automatically named as col1, col2 ...
Examples:
>>> table1('''
... aa 43
... ac 34
... ab 21
... as 23
... ''')
>>> sql("select partialsort(1,a,b) from table1")
c1 | c2
-------
aa | 43
ab | 21
ac | 34
as | 23
"""
registered=True
def __init__(self):
self.topn=[]
self.lessval=None
self.stepsnum=0
self.sortnum = None
def step(self, *args):
if len(args)<2:
raise functions.OperatorError("partialsort","Wrong number of arguments")
if not self.sortnum:
self.sortnum = tuple(i for i in xrange(args[0]))
self.topn.append(args[1:])
self.stepsnum+=1
pass
def final(self):
yield tuple('c'+str(i) for i in xrange(1,len(self.topn[0])+1))
self.topn.sort(key=operator.itemgetter(*self.sortnum))
for el in self.topn:
yield el
if not ('.' in __name__):
"""
This is needed to be able to test the function, put it at the end of every
new function you create
"""
import sys
import setpath
from functions import *
testfunction()
if __name__ == "__main__":
reload(sys)
sys.setdefaultencoding('utf-8')
import doctest
doctest.testmod()