@@ -220,24 +220,14 @@ public RemapConverter(@NotNull TableInfo targetTable, boolean includeTitleColumn
220220 public void setIncludePkLookup (boolean includePkLookup )
221221 {
222222 _includePkLookup = includePkLookup ;
223+ _maps = null ;
223224 }
224225
225226 public ColumnInfo getPkColumn ()
226227 {
227228 return _targetTable .getPkColumns ().getFirst ();
228229 }
229230
230- private Pair <ColumnInfo , Map <?, ?>> pkLookupMap ()
231- {
232- if (!_includePkLookup )
233- return null ;
234-
235- if (_pkColumnLookupMap == null )
236- _pkColumnLookupMap = Pair .of (getPkColumn (), new HashMap <>());
237-
238- return _pkColumnLookupMap ;
239- }
240-
241231 private List <Triple <ColumnInfo , ColumnInfo , MultiValuedMap <?, ?>>> getMaps ()
242232 {
243233 if (_maps == null )
@@ -281,6 +271,11 @@ public ColumnInfo getPkColumn()
281271 _titleColumnLookupMap = Triple .of (pkCol , titleColumn , new ArrayListValuedHashMap ());
282272 }
283273 }
274+
275+ if (_includePkLookup )
276+ {
277+ _pkColumnLookupMap = Pair .of (pkCol , new HashMap <>());
278+ }
284279 }
285280 return _maps ;
286281 }
@@ -296,10 +291,9 @@ public Object mappedValue(Object k)
296291
297292 List <Triple <ColumnInfo , ColumnInfo , MultiValuedMap <?,?>>> maps = getMaps ();
298293
299- Pair <ColumnInfo , Map <?, ?>> pkLookupMap = pkLookupMap ();
300- if (pkLookupMap != null )
294+ if (_pkColumnLookupMap != null )
301295 {
302- Object v = fetch (pkLookupMap , k );
296+ Object v = fetch (_pkColumnLookupMap , k );
303297 if (v != null )
304298 return v ;
305299 }
@@ -2239,97 +2233,6 @@ public void convertRemapTest() throws Exception
22392233
22402234 }
22412235
2242- /** Lookup fixture with one text alternate key (Value) over an integer pk (RowId); Ordinal is unique but not text, so it yields no map. */
2243- private EnumTableInfo <LookupValues > remapLookupTable ()
2244- {
2245- var core = QueryService .get ().getUserSchema (TestContext .get ().getUser (), JunitUtil .getTestContainer (), "core" );
2246- return new EnumTableInfo <>(LookupValues .class , core , "fake enum" , true );
2247- }
2248-
2249- @ Test
2250- public void remapCacheSurvivesPkLookupToggle ()
2251- {
2252- RemapConverter converter = new RemapConverter (remapLookupTable (), true , false , true );
2253-
2254- // RemappingConvertColumn flips this before every row, so it must not discard what earlier rows resolved
2255- converter .setIncludePkLookup (false );
2256-
2257- List <Triple <ColumnInfo , ColumnInfo , MultiValuedMap <?, ?>>> maps = converter .getMaps ();
2258- assertEquals ("expected one alternate-key map, on the Value column" , 1 , maps .size ());
2259-
2260- // Seed keys no enum value can supply, so anything but a cache hit resolves to null
2261- MultiValuedMap cache = maps .getFirst ().getRight ();
2262- Integer seeded = 42 ;
2263- cache .put ("seeded-hit" , seeded );
2264- cache .put ("seeded-miss" , converter .MISS );
2265-
2266- assertEquals (seeded , converter .mappedValue ("seeded-hit" ));
2267- assertNull (converter .mappedValue ("seeded-miss" ));
2268-
2269- for (int i = 0 ; i < 3 ; i ++)
2270- {
2271- converter .setIncludePkLookup (true );
2272- converter .setIncludePkLookup (false );
2273- }
2274-
2275- assertSame ("toggling includePkLookup discarded the cached lookups" , maps , converter .getMaps ());
2276- assertEquals ("resolved value was discarded, so every row re-queries it" , seeded , converter .mappedValue ("seeded-hit" ));
2277- assertNull ("MISS marker was discarded, so every row re-queries the absent value" , converter .mappedValue ("seeded-miss" ));
2278- }
2279-
2280- @ Test
2281- public void remapResolutionIsStableAcrossPkLookupToggle ()
2282- {
2283- RemapConverter converter = new RemapConverter (remapLookupTable (), true , false , true );
2284- converter .setIncludePkLookup (false );
2285-
2286- Object resolved = converter .mappedValue (LookupValues .Two .name ());
2287- assertNotNull ("expected " + LookupValues .Two + " to resolve by alternate key" , resolved );
2288-
2289- converter .setIncludePkLookup (true );
2290- converter .setIncludePkLookup (false );
2291-
2292- assertEquals (resolved , converter .mappedValue (LookupValues .Two .name ()));
2293- }
2294-
2295- @ Test
2296- public void remapAlternateKeyWinsWhenPkLookupIsOff ()
2297- {
2298- RemapConverter converter = new RemapConverter (remapLookupTable (), true , false , true );
2299-
2300- // Seed the two maps to disagree on one key, so the resolved value says which map was consulted
2301- Integer key = 7 ;
2302- Integer pkResolution = 7 ;
2303- Integer akResolution = 99 ;
2304- Map pkCache = converter .pkLookupMap ().getValue ();
2305- MultiValuedMap akCache = converter .getMaps ().getFirst ().getRight ();
2306- pkCache .put (key , pkResolution );
2307- akCache .put (key , akResolution );
2308-
2309- assertEquals ("pk lookup should take precedence while includePkLookup is on" , pkResolution , converter .mappedValue (key ));
2310-
2311- // The pk map survives the toggle, so this also pins that it is not consulted while the flag is off
2312- converter .setIncludePkLookup (false );
2313- assertEquals ("alternate key should resolve while includePkLookup is off" , akResolution , converter .mappedValue (key ));
2314- }
2315-
2316- @ Test
2317- public void remapPkLookupMapIsRetained ()
2318- {
2319- RemapConverter converter = new RemapConverter (remapLookupTable (), true , false , false );
2320- assertNull ("pk lookup map should not exist while includePkLookup is off" , converter .pkLookupMap ());
2321-
2322- converter .setIncludePkLookup (true );
2323- Pair <ColumnInfo , Map <?, ?>> pkMap = converter .pkLookupMap ();
2324- assertNotNull (pkMap );
2325-
2326- converter .setIncludePkLookup (false );
2327- assertNull (converter .pkLookupMap ());
2328-
2329- converter .setIncludePkLookup (true );
2330- assertSame ("pk lookup map was rebuilt rather than retained" , pkMap , converter .pkLookupMap ());
2331- }
2332-
23332236 @ Test
23342237 public void getFileRootSubstitutedFilePathTest ()
23352238 {
0 commit comments