@@ -1788,33 +1788,54 @@ def test_qb_is_type_basic_09(self):
17881788 (
17891789 default .Link_Inh_A ,
17901790 {
1791- "n" : 1 ,
1791+ "n" : - 1 ,
1792+ "l" : None ,
1793+ },
1794+ ),
1795+ (
1796+ default .Link_Inh_A2 ,
1797+ {
1798+ "n" : - 2 ,
1799+ "l" : None ,
1800+ },
1801+ ),
1802+ (
1803+ default .Link_Inh_A3 ,
1804+ {
1805+ "n" : - 3 ,
17921806 "l" : None ,
17931807 },
17941808 ),
17951809 (
17961810 default .Link_Inh_A ,
1811+ {
1812+ "n" : 1 ,
1813+ "l" : None ,
1814+ },
1815+ ),
1816+ (
1817+ default .Link_Inh_A2 ,
17971818 {
17981819 "n" : 4 ,
17991820 "l" : possible_targets [4 ],
18001821 },
18011822 ),
18021823 (
1803- default .Link_Inh_A ,
1824+ default .Link_Inh_A2 ,
18041825 {
18051826 "n" : 7 ,
18061827 "l" : None ,
18071828 },
18081829 ),
18091830 (
1810- default .Link_Inh_A ,
1831+ default .Link_Inh_A3 ,
18111832 {
18121833 "n" : 13 ,
18131834 "l" : possible_targets [13 ],
18141835 },
18151836 ),
18161837 (
1817- default .Link_Inh_A ,
1838+ default .Link_Inh_A3 ,
18181839 {
18191840 "n" : 17 ,
18201841 "l" : possible_targets [17 ],
@@ -1851,33 +1872,54 @@ def test_qb_is_type_basic_10(self):
18511872 (
18521873 default .Link_Inh_A ,
18531874 {
1854- "n" : 1 ,
1875+ "n" : - 1 ,
1876+ "l" : None ,
1877+ },
1878+ ),
1879+ (
1880+ default .Link_Inh_A2 ,
1881+ {
1882+ "n" : - 2 ,
1883+ "l" : None ,
1884+ },
1885+ ),
1886+ (
1887+ default .Link_Inh_A3 ,
1888+ {
1889+ "n" : - 3 ,
18551890 "l" : None ,
18561891 },
18571892 ),
18581893 (
18591894 default .Link_Inh_A ,
1895+ {
1896+ "n" : 1 ,
1897+ "l" : None ,
1898+ },
1899+ ),
1900+ (
1901+ default .Link_Inh_A2 ,
18601902 {
18611903 "n" : 4 ,
18621904 "l" : possible_targets [4 ],
18631905 },
18641906 ),
18651907 (
1866- default .Link_Inh_A ,
1908+ default .Link_Inh_A2 ,
18671909 {
18681910 "n" : 7 ,
18691911 "l" : None ,
18701912 },
18711913 ),
18721914 (
1873- default .Link_Inh_A ,
1915+ default .Link_Inh_A3 ,
18741916 {
18751917 "n" : 13 ,
18761918 "l" : possible_targets [13 ],
18771919 },
18781920 ),
18791921 (
1880- default .Link_Inh_A ,
1922+ default .Link_Inh_A3 ,
18811923 {
18821924 "n" : 17 ,
18831925 "l" : possible_targets [17 ],
@@ -2101,6 +2143,118 @@ def test_qb_is_type_as_function_arg_03(self):
21012143 )
21022144 self .assertEqual (sorted (result ), [6 , 13 , 20 ])
21032145
2146+ def test_qb_backlinks_01 (self ):
2147+ from models .orm_qb import default
2148+
2149+ inh_a_objs = self .client .query (default .Inh_A .select (a = True ))
2150+ possible_targets = {obj .a : obj for obj in inh_a_objs }
2151+
2152+ query = default .Inh_A .__backlinks__ .l .is_ (default .Link_Inh_A ).select (
2153+ n = True , l = True
2154+ )
2155+ result = self .client .query (query )
2156+
2157+ self ._assertObjectsWithFields (
2158+ result ,
2159+ "n" ,
2160+ [
2161+ (
2162+ default .Link_Inh_A ,
2163+ {
2164+ "n" : 1 ,
2165+ "l" : possible_targets [1 ],
2166+ },
2167+ ),
2168+ (
2169+ default .Link_Inh_A2 ,
2170+ {
2171+ "n" : 4 ,
2172+ "l" : possible_targets [4 ],
2173+ },
2174+ ),
2175+ (
2176+ default .Link_Inh_A2 ,
2177+ {
2178+ "n" : 7 ,
2179+ "l" : possible_targets [7 ],
2180+ },
2181+ ),
2182+ (
2183+ default .Link_Inh_A3 ,
2184+ {
2185+ "n" : 13 ,
2186+ "l" : possible_targets [13 ],
2187+ },
2188+ ),
2189+ (
2190+ default .Link_Inh_A3 ,
2191+ {
2192+ "n" : 17 ,
2193+ "l" : possible_targets [17 ],
2194+ },
2195+ ),
2196+ ],
2197+ )
2198+
2199+ def test_qb_backlinks_02 (self ):
2200+ # Two unrelated links with the same name
2201+ from models .orm_qb import default
2202+
2203+ inh_a_objs = self .client .query (default .Inh_A .select (a = True ))
2204+ possible_targets = {obj .a : obj for obj in inh_a_objs }
2205+
2206+ query_a = default .Inh_AB .__backlinks__ .l .is_ (default .Link_Inh_A ).select (
2207+ n = True , l = True
2208+ )
2209+ result_a = self .client .query (query_a )
2210+
2211+ self ._assertObjectsWithFields (
2212+ result_a ,
2213+ "n" ,
2214+ [
2215+ (
2216+ default .Link_Inh_A2 ,
2217+ {
2218+ "n" : 4 ,
2219+ "l" : possible_targets [4 ],
2220+ },
2221+ ),
2222+ (
2223+ default .Link_Inh_A3 ,
2224+ {
2225+ "n" : 17 ,
2226+ "l" : possible_targets [17 ],
2227+ },
2228+ ),
2229+ ],
2230+ )
2231+
2232+ query_ab = default .Inh_AB .__backlinks__ .l .is_ (default .Link_Inh_AB ).select (
2233+ n = True , l = True
2234+ )
2235+ result_ab = self .client .query (query_ab )
2236+
2237+ self ._assertObjectsWithFields (
2238+ result_ab ,
2239+ "n" ,
2240+ [
2241+ (
2242+ default .Link_Inh_AB ,
2243+ {
2244+ "n" : 1004 ,
2245+ "l" : possible_targets [4 ],
2246+ },
2247+ ),
2248+ (
2249+ default .Link_Inh_AB ,
2250+ {
2251+ "n" : 1017 ,
2252+ "l" : possible_targets [17 ],
2253+ },
2254+ ),
2255+ ],
2256+ )
2257+
21042258
21052259class TestQueryBuilderModify (tb .ModelTestCase ):
21062260 """This test suite is for data manipulation using QB."""
0 commit comments