Skip to content
Snippets Groups Projects
Commit 6a136034 authored by Valentin Lorentz's avatar Valentin Lorentz
Browse files

Implement union simplification.

parent f60d407d
No related branches found
No related tags found
No related merge requests found
import itertools
from ppp_datamodel.nodes import Resource
from ppp_datamodel.nodes.list_operators import *
__all__ = ['simplify']
def simplify_union(tree):
if len(tree.list) == 0:
return List([])
elif len(tree.list) == 1:
return tree.list[0]
list_ = [x for x in tree.list if x]
lists = (x.list for x in list_ if isinstance(x, List))
not_lists = [x for x in list_ if not isinstance(x, List)]
lists = list(set(itertools.chain(*lists)))
if not_lists:
all_ = not_lists
all_.append(List(lists))
return Union(all_)
else:
return List(lists)
predicates = {
Union: simplify_union
}
def predicate(tree):
for (cls, f) in predicates.items():
if isinstance(tree, cls):
return f(tree)
return tree
def simplify(tree):
return tree.traverse(predicate)
......@@ -24,7 +24,7 @@ setup(
'Topic :: Software Development :: Libraries',
],
install_requires=[
'ppp_datamodel>=0.5.2,<0.6',
'ppp_datamodel>=0.5.22,<0.6',
],
packages=[
'ppp_libmodule',
......
import unittest
from ppp_datamodel.nodes import Triple as T
from ppp_datamodel.nodes import Missing as M
from ppp_datamodel.nodes import Resource as R
from ppp_datamodel.nodes.list_operators import *
from ppp_libmodule.simplification import simplify
class SimplificationTestCase(unittest.TestCase):
def testUnionTrivial(self):
self.assertEqual(simplify(Union([])), List([]))
self.assertEqual(simplify(Union([List([R('a')])])),
List([R('a')]))
def testUnionResourceLists(self):
t = Union([List([R('a'), R('b')]), List([R('c')])])
t = simplify(t)
self.assertIsInstance(t, List)
self.assertEqual(set(t.list), {R('a'), R('b'), R('c')})
def testUnionMixed(self):
t = Union([List([R('a'), R('b')]), T(M(), M(), M())])
t = simplify(t)
self.assertIsInstance(t, Union)
self.assertEqual(t.list[0], T(M(), M(), M()))
self.assertIsInstance(t.list[1], List)
self.assertEqual(set(t.list[1].list), {R('a'), R('b')})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment