server/msplanner.py
branchstable
changeset 2109 f469368df530
parent 2108 b3f6fa7ad59f
child 2110 d7773fb1b892
equal deleted inserted replaced
2108:b3f6fa7ad59f 2109:f469368df530
  1214         newroot = Select()
  1214         newroot = Select()
  1215         self.sources = sorted(sources)
  1215         self.sources = sorted(sources)
  1216         self.terms = terms
  1216         self.terms = terms
  1217         self.solindices = solindices
  1217         self.solindices = solindices
  1218         self.final = final
  1218         self.final = final
       
  1219         self._pending_vrefs = []
  1219         # terms which appear in unsupported branches
  1220         # terms which appear in unsupported branches
  1220         needsel |= self.extneedsel
  1221         needsel |= self.extneedsel
  1221         self.needsel = needsel
  1222         self.needsel = needsel
  1222         # terms which appear in supported branches
  1223         # terms which appear in supported branches
  1223         self.mayneedsel = set()
  1224         self.mayneedsel = set()
  1367             rel, node = self.visit_default(node, newroot, terms)
  1368             rel, node = self.visit_default(node, newroot, terms)
  1368             return rel, node
  1369             return rel, node
  1369         else:
  1370         else:
  1370             raise UnsupportedBranch()
  1371             raise UnsupportedBranch()
  1371         rschema = self.schema.rschema(node.r_type)
  1372         rschema = self.schema.rschema(node.r_type)
       
  1373         self._pending_vrefs = []
  1372         try:
  1374         try:
  1373             res = self.visit_default(node, newroot, terms)[0]
  1375             res = self.visit_default(node, newroot, terms)[0]
  1374         except Exception, ex:
  1376         except:
       
  1377             for vref in self._pending_vrefs:
       
  1378                 vref.unregister_reference()
  1375             raise
  1379             raise
  1376         ored = node.ored()
  1380         ored = node.ored()
  1377         if rschema.is_final() or rschema.inlined:
  1381         if rschema.is_final() or rschema.inlined:
  1378             vrefs = node.children[1].get_nodes(VariableRef)
  1382             vrefs = node.children[1].get_nodes(VariableRef)
  1379             if not vrefs:
  1383             if not vrefs:
  1432             raise UnsupportedBranch(node.name)
  1436             raise UnsupportedBranch(node.name)
  1433         self.mayneedsel.add(node.name)
  1437         self.mayneedsel.add(node.name)
  1434         # set scope so we can insert types restriction properly
  1438         # set scope so we can insert types restriction properly
  1435         newvar = newroot.get_variable(node.name)
  1439         newvar = newroot.get_variable(node.name)
  1436         newvar.stinfo['scope'] = self.scopes.get(node.variable.scope, newroot)
  1440         newvar.stinfo['scope'] = self.scopes.get(node.variable.scope, newroot)
  1437         return VariableRef(newvar), node
  1441         vref = VariableRef(newvar)
       
  1442         self._pending_vrefs.append(vref)
       
  1443         return vref, node
  1438 
  1444 
  1439     def visit_constant(self, node, newroot, terms):
  1445     def visit_constant(self, node, newroot, terms):
  1440         return copy_node(newroot, node), node
  1446         return copy_node(newroot, node), node
  1441 
  1447 
  1442     def visit_default(self, node, newroot, terms):
  1448     def visit_default(self, node, newroot, terms):