예제 #1
0
def parse_expressions():
    db = get_test_db()
    logs = db.logs
    one = logs.keys()[0]
#     l0 = logs[one]
#     print yaml_dump_pretty(l0._asdict())
    query = one + '/{10:15}'
    res = dtu.fuzzy_match(query, logs, filters=filters_slice, raise_if_no_matches=True)

    assert len(res) == 1
    l1 = res[list(res)[0]]

    assert l1.t0 == 10, l1.t0
    assert l1.t1 == 15, l1.t1
    assert l1.length == 5, l1.length

    query = one + '/{10:15}/{1:3}'
    res2 = dtu.fuzzy_match(query, logs, filters=filters_slice, raise_if_no_matches=True)
    assert len(res2) == 1

    l2 = res2[list(res2)[0]]
#     print l2.t0, l2.t1, l2.length
    assert l2.t0 == 11
    assert l2.t1 == 13
    assert l2.length == 2, l1.length
예제 #2
0
def my_filter():

    rc = re.compile(dtu.slice_regexp)
    m = rc.search('[1:2:3]')
    assert m.group('a') == '1'
    assert m.group('b') == '2'
    assert m.group('c') == '3'

    Species = namedtuple('Species', 'name size weight')
    data = OrderedDict([
        ('jeb', Species('A big horse', 'large', 200)),
        ('fuffy', Species('A medium dog', 'medium', 50)),
        ('ronny', Species('A medium cat', 'medium', 30)),
    ])
    expect(data, 'all', ['jeb', 'fuffy', 'ronny'])

    expect(data, 'all/[0]', ['jeb'])
    expect(data, 'all/[0:]', ['jeb', 'fuffy', 'ronny'])
    expect(data, 'all/[0:1]', ['jeb'])
    expect(data, 'all/[:-1]', ['jeb', 'fuffy'])
    expect(data, 'all/[::1]', ['jeb', 'fuffy', 'ronny'])
    expect(data, 'all/[::2]', ['jeb', 'ronny'])
    expect(data, 'all/[0:3]', ['jeb', 'fuffy', 'ronny'])

    res = dtu.fuzzy_match('all/shuffle', data)
    assert len(res) == 3
예제 #3
0
 def query(self, family_name, query, raise_if_no_matches=False):
     family = self.get_family(family_name)
     instances = family.instances
     result = fuzzy_match(query,
                          instances,
                          raise_if_no_matches=raise_if_no_matches)
     return result
예제 #4
0
def parse_expressions4():
    db = get_test_db()
    logs = db.logs
    one = logs.keys()[0]
    query = one + '/{1:}'
    res = dtu.fuzzy_match(query, logs, filters=filters_slice, raise_if_no_matches=True)
    print (res)
    assert len(res) == 1
    l1 = res[list(res)[0]]
    assert l1.t0 == 1
예제 #5
0
def parse_expressions2():
    db = get_test_db()
    logs = db.logs
    one = logs.keys()[0]
    query = one + '/{10.5:15.5}'
    res = dtu.fuzzy_match(query, logs, filters=filters_slice, raise_if_no_matches=True)

    assert len(res) == 1
    l1 = res[list(res)[0]]
    assert l1.t0 == 10.5, l1.t0
    assert l1.t1 == 15.5, l1.t1
    assert l1.length == 5, l1.length
예제 #6
0
def parse_expressions2():
    db = get_easy_logs_db_cached_if_possible()
    logs = db.logs
    one = logs.keys()[0]
    query = one + '/{10.5:15.5}'
    res = fuzzy_match(query, logs, filters=filters_slice, raise_if_no_matches=True)
    
    assert len(res) == 1
    l1 = res[one]
    assert l1.t0 == 10.5
    assert l1.t1 == 15.5
    assert l1.length == 5, l1.length
예제 #7
0
    def query(self, query, raise_if_no_matches=True):
        """
            query: a string

            Returns an OrderedDict str -> PhysicalLog.
        """
        check_isinstance(query, str)
        filters = OrderedDict()
        filters.update(filters_slice)
        filters.update(filters0)
        result = fuzzy_match(query,
                             self.logs,
                             filters=filters,
                             raise_if_no_matches=raise_if_no_matches)
        return result
예제 #8
0
 def query(self, family_name, query, raise_if_no_matches=False):
     if isinstance(query, list):
         res = OrderedDict()
         for q in query:
             res.update(
                 self.query(family_name, q, raise_if_no_matches=False))
         if raise_if_no_matches and not res:
             msg = "Could not find any match for the queries:"
             for q in query:
                 msg += '\n- %s' % q
             raise dtu.DTNoMatches(msg)
         return res
     else:
         family = self.get_family(family_name)
         instances = family.instances
         result = dtu.fuzzy_match(query,
                                  instances,
                                  raise_if_no_matches=raise_if_no_matches)
         return result
예제 #9
0
def expect(data, query, result_keys, filters=None):
    result_keys = list(result_keys)
    check_isinstance(data, OrderedDict)

    if True:
        spec = dtu.parse_match_spec(query, filters=filters)
        print '-----'
        print 'Query: %s' % query
        print dtu.indent(spec, '', 'Spec: ')

    res = dtu.fuzzy_match(query, data, filters=filters)
    check_isinstance(res, OrderedDict)

    if list(res) != result_keys:
        msg = 'Error:'
        msg += '\n Data: %s' % data
        msg += '\n Query: %s' % query
        msg += '\n Result: %s' % list(res)
        msg += '\n Expect: %s' % list(result_keys)
        raise Exception(msg)
예제 #10
0
def query_logs(logs, query, raise_if_no_matches=True):
    """
        query: a string or a list of strings

        Returns an OrderedDict str -> PhysicalLog.

        The query can also be a filename.

    """
    if isinstance(query, list):
        res = OrderedDict()
        for q in query:
            res.update(query_logs(logs, q, raise_if_no_matches=False))
        if raise_if_no_matches and not res:
            msg = "Could not find any match for the queries:"
            for q in query:
                msg += '\n- %s' % q
            raise dtu.DTNoMatches(msg)
        return res
    else:
        dtu.check_isinstance(query, str)

        filters = OrderedDict()
        filters.update(filters_slice)
        filters.update(dtu.filters0)
        aliases = OrderedDict()
        aliases.update(logs)
        # adding aliases unless we are asking for everything
        if query != '*':
            # print('adding more (query = %s)' % query)
            for _, log in logs.items():
                dtr = DTR.from_yaml(log.resources['bag'])

                original_name = dtr.name

                # print ('alias: %s %s' % (original_name, dtr.name))
                aliases[original_name] = log
                original_name = original_name.replace('.bag', '')
                aliases[original_name] = log

        result = dtu.fuzzy_match(query,
                                 aliases,
                                 filters=filters,
                                 raise_if_no_matches=raise_if_no_matches)
        # remove doubles after
        # XXX: this still has bugs
        present = defaultdict(set)
        for k, v in result.items():
            present[id(v)].add(k)

        def choose(options):
            if len(options) == 1:
                return list(options)[0]
            else:
                options = sorted(options, key=len)
                return options[0]

        c = OrderedDict()
        for k, v in result.items():
            chosen = choose(present[id(v)])
            if k == chosen:
                c[k] = v

        return c