提交 bfa1f2d4 authored 作者: carriepl's avatar carriepl

Various fixes in optdb.py

上级 49230a8d
...@@ -178,12 +178,15 @@ class Query(object): ...@@ -178,12 +178,15 @@ class Query(object):
""" """
def __init__(self, include, require=None, exclude=None, def __init__(self, include, require=None, exclude=None,
subquery=None, position_cutoff=None, extra_optimizations=[]): subquery=None, position_cutoff=None,
extra_optimizations=None):
self.include = OrderedSet(include) self.include = OrderedSet(include)
self.require = require or OrderedSet() self.require = require or OrderedSet()
self.exclude = exclude or OrderedSet() self.exclude = exclude or OrderedSet()
self.subquery = subquery or {} self.subquery = subquery or {}
self.position_cutoff = position_cutoff self.position_cutoff = position_cutoff
if extra_optimizations is None:
extra_optimizations = []
self.extra_optimizations = extra_optimizations self.extra_optimizations = extra_optimizations
if isinstance(self.require, (list, tuple)): if isinstance(self.require, (list, tuple)):
self.require = OrderedSet(self.require) self.require = OrderedSet(self.require)
...@@ -337,23 +340,26 @@ class SequenceDB(DB): ...@@ -337,23 +340,26 @@ class SequenceDB(DB):
# The Query instance might contain extra optimizations which need # The Query instance might contain extra optimizations which need
# to be added the the sequence of optimizations (don't alter the # to be added the the sequence of optimizations (don't alter the
# original dictionary) # original dictionary)
position_dict = position_dict.copy() if len(tags[0].extra_optimizations) > 0:
for extra_opt in tags[0].extra_optimizations: position_dict = position_dict.copy()
# Give a name to the extra optimization for extra_opt in tags[0].extra_optimizations:
opt, position = extra_opt # Give a name to the extra optimization (include both the
opt.name = str(opt.__class__) # class name for descriptiveness and id to avoid name
# collisions)
# Add the extra optimization to the optimization sequence opt, position = extra_opt
opts.add(opt) opt.name = "%s_%i" % (opt.__class__, id(opt))
position_dict[opt.name] = position
# Add the extra optimization to the optimization sequence
if position < position_cutoff:
opts.add(opt)
position_dict[opt.name] = position
opts = [o for o in opts if position_dict[o.name] < position_cutoff] opts = [o for o in opts if position_dict[o.name] < position_cutoff]
# We want to sort by position and then if collision by name # We want to sort by position and then if collision by name
# for deterministic optimization. Since Python 2.2, sort is # for deterministic optimization. Since Python 2.2, sort is
# stable, so sort by name first, then by position. This give # stable, so sort by name first, then by position. This give
# the order we want. # the order we want.
opts.sort(key=lambda obj: obj.name) opts.sort(key=lambda obj: (position_dict[obj.name], obj.name))
opts.sort(key=lambda obj: position_dict[obj.name])
kwargs = {} kwargs = {}
if self.failure_callback: if self.failure_callback:
kwargs["failure_callback"] = self.failure_callback kwargs["failure_callback"] = self.failure_callback
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论