@@ -1898,6 +1898,70 @@ def ls(x):
18981898 self .assertEqual (ls (self .db .user .get ('7' , 'issues' )), [])
18991899 self .assertEqual (ls (self .db .user .get ('10' , 'issues' )), ['7' , '8' ])
19001900
1901+ def testFilteringRevLinkExpression (self ):
1902+ ae , iiter = self .filteringSetupTransitiveSearch ('user' )
1903+ # We have
1904+ # issue assignedto
1905+ # 1: 6
1906+ # 2: 6
1907+ # 3: 7
1908+ # 4: 8
1909+ # 5: 9
1910+ # 6: 10
1911+ # 7: 10
1912+ # 8: 10
1913+ for filt in iiter ():
1914+ # Explicit 'or'
1915+ ae (filt (None , {'issues' : ['3' , '4' , '-4' ]}), ['7' , '8' ])
1916+ # Implicit or with '-1'
1917+ ae (filt (None , {'issues' : ['3' , '4' , '-1' ]}),
1918+ ['1' , '2' , '3' , '4' , '5' , '7' , '8' ])
1919+ # Explicit or with '-1': 3 or 4 or empty
1920+ ae (filt (None , {'issues' : ['3' , '4' , '-4' , '-1' , '-4' ]}),
1921+ ['1' , '2' , '3' , '4' , '5' , '7' , '8' ])
1922+ # '3' and empty
1923+ ae (filt (None , {'issues' : ['3' , '-1' , '-3' ]}), [])
1924+ # '6' and '7' and '8'
1925+ ae (filt (None , {'issues' : ['6' , '7' , '-3' , '8' , '-3' ]}), ['10' ])
1926+ # '6' and '7' or '1' and '2'
1927+ ae (filt (None , {'issues' : ['6' , '7' , '-3' , '1' , '2' , '-3' , '-4' ]}),
1928+ ['6' , '10' ])
1929+ # '1' or '4'
1930+ ae (filt (None , {'issues' : ['1' , '4' , '-4' ]}), ['6' , '8' ])
1931+
1932+ # Now retire some linked-to issues and retry
1933+ self .db .issue .retire ('6' )
1934+ self .db .issue .retire ('2' )
1935+ self .db .issue .retire ('3' )
1936+ self .db .commit ()
1937+ # We have now
1938+ # issue assignedto
1939+ # 1: 6
1940+ # 4: 8
1941+ # 5: 9
1942+ # 7: 10
1943+ # 8: 10
1944+ for filt in iiter ():
1945+ # Explicit 'or'
1946+ ae (filt (None , {'issues' : ['3' , '4' , '-4' ]}), ['8' ])
1947+ # Implicit or with '-1'
1948+ ae (filt (None , {'issues' : ['3' , '4' , '-1' ]}),
1949+ ['1' , '2' , '3' , '4' , '5' , '7' , '8' ])
1950+ # Explicit or with '-1': 3 or 4 or empty
1951+ ae (filt (None , {'issues' : ['3' , '4' , '-4' , '-1' , '-4' ]}),
1952+ ['1' , '2' , '3' , '4' , '5' , '7' , '8' ])
1953+ # '3' and empty
1954+ ae (filt (None , {'issues' : ['3' , '-1' , '-3' ]}), [])
1955+ # '6' and '7' and '8'
1956+ ae (filt (None , {'issues' : ['6' , '7' , '-3' , '8' , '-3' ]}), [])
1957+ # '7' and '8'
1958+ ae (filt (None , {'issues' : ['7' , '8' , '-3' ]}), ['10' ])
1959+ # '6' and '7' or '1' and '2'
1960+ ae (filt (None , {'issues' : ['6' , '7' , '-3' , '1' , '2' , '-3' , '-4' ]}),
1961+ [])
1962+ # '1' or '4'
1963+ ae (filt (None , {'issues' : ['1' , '4' , '-4' ]}), ['6' , '8' ])
1964+
19011965 def testFilteringLinkSortSearchMultilink (self ):
19021966 ae , iiter = self .filteringSetup ()
19031967 a = 'assignedto'
@@ -2054,10 +2118,12 @@ def testFilteringRevMultilinkExpression(self):
20542118 # 7: 5
20552119 # 8:
20562120 # Retire users '9' and '10' to reduce list
2057- self .db .user .retire ('9' )
2058- self .db .user .retire ('10' )
2059- self .db .commit ()
2121+ self .db .user .retire ('9' )
2122+ self .db .user .retire ('10' )
2123+ self .db .commit ()
20602124 for filt in iiter ():
2125+ # not empty
2126+ ae (filt (None , {ni : ['-1' , '-2' ]}), ['3' , '4' , '5' ])
20612127 # '1' or '2'
20622128 ae (filt (None , {ni : ['1' , '2' , '-4' ]}), ['4' , '5' ])
20632129 # '6' or '7'
@@ -2081,6 +2147,49 @@ def testFilteringRevMultilinkExpression(self):
20812147 # ('4' and empty) or ('2' or empty)
20822148 ae (filt (None , {ni : ['4' , '-1' , '-3' , '2' , '-1' , '-4' , '-4' ]}),
20832149 ['1' , '2' , '5' , '6' , '7' , '8' ])
2150+ # Retire issues 2, 6 and retry
2151+ self .db .issue .retire ('2' )
2152+ self .db .issue .retire ('6' )
2153+ self .db .commit ()
2154+ # After this setup we have the following values for nosy:
2155+ # issue nosy
2156+ # 1: 4
2157+ # 3:
2158+ # 4:
2159+ # 5:
2160+ # 7: 5
2161+ # 8:
2162+ for filt in iiter ():
2163+ # not empty
2164+ ae (filt (None , {ni : ['-1' , '-2' ]}), ['4' , '5' ])
2165+ # '1' or '2' (implicit)
2166+ ae (filt (None , {ni : ['1' , '2' ]}), ['4' ])
2167+ # '1' or '2'
2168+ ae (filt (None , {ni : ['1' , '2' , '-4' ]}), ['4' ])
2169+ # '6' or '7'
2170+ ae (filt (None , {ni : ['6' , '7' , '-4' ]}), ['5' ])
2171+ # '6' and '7'
2172+ ae (filt (None , {ni : ['6' , '7' , '-3' ]}), [])
2173+ # '6' and not '1'
2174+ ae (filt (None , {ni : ['6' , '1' , '-2' , '-3' ]}), [])
2175+ # not '1'
2176+ ae (filt (None , {ni : ['1' , '-2' ]}),
2177+ ['1' , '2' , '3' , '5' , '6' , '7' , '8' ])
2178+ # '2' or empty (implicit or)
2179+ ae (filt (None , {ni : ['-1' , '2' ]}), ['1' , '2' , '3' , '6' , '7' , '8' ])
2180+ # '2' or empty (explicit or)
2181+ ae (filt (None , {ni : ['-1' , '2' , '-4' ]}),
2182+ ['1' , '2' , '3' , '6' , '7' , '8' ])
2183+ # empty or '2' (explicit or)
2184+ ae (filt (None , {ni : ['2' , '-1' , '-4' ]}),
2185+ ['1' , '2' , '3' , '6' , '7' , '8' ])
2186+ # '2' and empty (should always return empty list)
2187+ ae (filt (None , {ni : ['-1' , '2' , '-3' ]}), [])
2188+ # empty and '2' (should always return empty list)
2189+ ae (filt (None , {ni : ['2' , '-1' , '-3' ]}), [])
2190+ # ('4' and empty) or ('2' or empty)
2191+ ae (filt (None , {ni : ['4' , '-1' , '-3' , '2' , '-1' , '-4' , '-4' ]}),
2192+ ['1' , '2' , '3' , '6' , '7' , '8' ])
20842193
20852194 def testFilteringMany (self ):
20862195 ae , iiter = self .filteringSetup ()
0 commit comments