Changeset 51


Ignore:
Timestamp:
May 15, 2009, 3:44:35 PM (11 years ago)
Author:
marchulsman
Message:

Rewrite changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • container/qg_rewrite.py

    r50 r51  
    146146            p = active.popleft()
    147147            if(p.ready(query.pass_results)):
    148                 print p.__name__
    149                 query.pass_results[p.__name__] = p.run(query)
     148                query.pass_results[p] = p.run(query)
    150149                for i in p.invalidates():
    151150                    if(i in query.pass_results):
    152151                        del query.pass_results[i]
    153                         active.append(self.pass_idx[i])
     152                        active.append(i)
    154153            else:
    155154                active.append(p)
     
    240239
    241240
    242 class FieldTransformPass(NodeVisitorFactory(),Pass):
    243    
     241class CollectInfoPass(NodeVisitorFactory(flags=F_CACHE | NF_ROBJ),Pass):
    244242    @classmethod
    245243    def run(cls,query):
    246244        self = cls(query.params)
     245        self.nodes = []
     246        self.fields = []
     247        self.cur_fields = set()
     248        self.visit(query.qg)
     249
     250       
     251         
     252        #breadth fir
     253        bfo_nodes = []
     254        bfo_queue = deque([query.qg])
     255        while(k):
     256            x = bfo_queue.pop_left()
     257            bfo_nodes.append(x)
     258            bfo_queue.extend([s for s in x.source if isinstance(s,Node)])
     259
     260
     261
     262        fieldidx = dict([(pos,id) for pos,id in enumerate(self.fields)])
     263        nodeidx = dict([(pos,id) for pos,id in enumerate(self.bfo_nodes)])
     264        return (bfo_nodes,nodeidx,fieldidx)
     265
     266    def visitnode(self,node):
     267        self.nodes.append(node)
     268        self.fields.extend([f for f in node.fields.id[node.actidx] \
     269                                        if f not in self.cur_fields    \
     270                                           and not self.cur_fields.add(f)])
     271        self.visitsources(node)
     272
     273
     274
     275
     276FM_OUT = 0
     277FM_IN = 1
     278FM_INACTIVE = 0
     279FM_ACTIVE = 1
     280class FieldMatrixPass(NodeVisitorFactory(flags=F_CACHE | NF_ROBJ),Pass):
     281    @classmethod
     282    def run(cls,query):
     283        self = cls(query.params)
     284        (bfo_nodes,self.nodeidx,self.fieldidx) = query.pass_results[CollectInfoPass]
     285
     286        self.fmatrix = numpy.zeros((len(bfo_nodes),2,len(self.fieldidx)),dtype="uint8")
     287
     288       
     289        for idx,node in enumerate(bfo_nodes):
     290            pass
     291       
     292       
     293        #set out vals of root node
     294        orig_rootidx = self.nodeidx[query.qg]
     295        self.fmatrix[orig_rootidx,FM_OUT,[self.fieldidx[aid] for aid in query.qg.actidx]] = FM_ACTIVE
     296
     297        #determine if there are repeated fields in the root node (and a root node has not
     298        #already been created)
     299        if(len(set(query.qg.actidx)) < len(query.qg.actidx) and query.qg.obj != "RepFieldSelect"):
     300            n = Node("RepFieldSelect",[query.qg])
     301            n.fields = query.qg.fields
     302            n.props = query.qg.props
     303            n.actidx = query.qg.actidx
     304            query.qg = n
     305
     306        self.visit(query.qg,self.fmatrix[orig_rootidx,FM_OUT,:])
     307
     308        return (self.nodes,self.fields)
     309
     310
    247311
    248312    def visitnode(self,node,used_fields):
    249         if(node.obj._fchange_allow):
    250             node.actidx = used_fields
    251             nfields = len(node.fields)
    252             pos = 0
    253             for s in source:
    254                 if(isinstance(s,Node)):
    255                     if(pos < snfields):
    256                         snfields = len(s.fields)
    257                         uf = used_fields[(used_fields > pos) & (used_fields < (pos + snfields))]
    258                         pos += snfields
    259                     else:
    260                         uf = s.actidx
    261                     self.visit(node,uf)
    262         else:
    263             for s in source:
    264                
    265                 self.visit(node,
    266                    
     313        node_idx = self.nodeidx[node]
     314        self.fmatrix[node_idx,FM_OUT,:] |= used_fields
     315
     316
     317
     318        pass
     319
     320    @classmethod
     321    def ready(self,pass_res):
     322        return (CollectInfoPass in pass_res)
    267323
    268324
    269325pe = PassManager()
     326pe.register(CollectInfoPass)
     327pe.register(FieldMatrixPass)
    270328pe.register(DrawNodeTreeVisitor)
    271329pp = PassManager()
Note: See TracChangeset for help on using the changeset viewer.