Add a test
This commit is contained in:
parent
bf476b9c32
commit
fdcf5f5d73
|
@ -49,8 +49,9 @@ public class SearchParamExtractorR4Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void refreshCacheIfNecessary() {
|
public boolean refreshCacheIfNecessary() {
|
||||||
// nothing
|
// nothing
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -93,7 +93,7 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
@Override
|
@Override
|
||||||
public Map<String, RuntimeSearchParam> getActiveSearchParams(String theResourceName) {
|
public Map<String, RuntimeSearchParam> getActiveSearchParams(String theResourceName) {
|
||||||
requiresActiveSearchParams();
|
requiresActiveSearchParams();
|
||||||
return myActiveSearchParams.get(theResourceName);
|
return getActiveSearchParams().get(theResourceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requiresActiveSearchParams() {
|
private void requiresActiveSearchParams() {
|
||||||
|
@ -207,12 +207,8 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
if (next.getCompositeOf() != null) {
|
if (next.getCompositeOf() != null) {
|
||||||
next.getCompositeOf().sort((theO1, theO2) -> StringUtils.compare(theO1.getName(), theO2.getName()));
|
next.getCompositeOf().sort((theO1, theO2) -> StringUtils.compare(theO1.getName(), theO2.getName()));
|
||||||
for (String nextBase : next.getBase()) {
|
for (String nextBase : next.getBase()) {
|
||||||
if (!activeParamNamesToUniqueSearchParams.containsKey(nextBase)) {
|
activeParamNamesToUniqueSearchParams.computeIfAbsent(nextBase, v -> new HashMap<>());
|
||||||
activeParamNamesToUniqueSearchParams.put(nextBase, new HashMap<>());
|
activeParamNamesToUniqueSearchParams.get(nextBase).computeIfAbsent(paramNames, t -> new ArrayList<>());
|
||||||
}
|
|
||||||
if (!activeParamNamesToUniqueSearchParams.get(nextBase).containsKey(paramNames)) {
|
|
||||||
activeParamNamesToUniqueSearchParams.get(nextBase).put(paramNames, new ArrayList<>());
|
|
||||||
}
|
|
||||||
activeParamNamesToUniqueSearchParams.get(nextBase).get(paramNames).add(next);
|
activeParamNamesToUniqueSearchParams.get(nextBase).get(paramNames).add(next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,11 +220,21 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
myActiveParamNamesToUniqueSearchParams = activeParamNamesToUniqueSearchParams;
|
myActiveParamNamesToUniqueSearchParams = activeParamNamesToUniqueSearchParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setFhirContextForUnitTest(FhirContext theFhirContext) {
|
||||||
|
myFhirContext = theFhirContext;
|
||||||
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void postConstruct() {
|
public void postConstruct() {
|
||||||
myBuiltInSearchParams = createBuiltInSearchParamMap(myFhirContext);
|
myBuiltInSearchParams = createBuiltInSearchParamMap(myFhirContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setSearchParamProviderForUnitTest(ISearchParamProvider theSearchParamProvider) {
|
||||||
|
mySearchParamProvider = theSearchParamProvider;
|
||||||
|
}
|
||||||
|
|
||||||
public int doRefresh(long theRefreshInterval) {
|
public int doRefresh(long theRefreshInterval) {
|
||||||
if (System.currentTimeMillis() - theRefreshInterval > myLastRefresh) {
|
if (System.currentTimeMillis() - theRefreshInterval > myLastRefresh) {
|
||||||
StopWatch sw = new StopWatch();
|
StopWatch sw = new StopWatch();
|
||||||
|
@ -314,8 +320,10 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
|
|
||||||
myLastRefresh = System.currentTimeMillis();
|
myLastRefresh = System.currentTimeMillis();
|
||||||
ourLog.info("Refreshed search parameter cache in {}ms", sw.getMillis());
|
ourLog.info("Refreshed search parameter cache in {}ms", sw.getMillis());
|
||||||
}
|
|
||||||
return myActiveSearchParams.size();
|
return myActiveSearchParams.size();
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract RuntimeSearchParam toRuntimeSp(SP theNextSp);
|
protected abstract RuntimeSearchParam toRuntimeSp(SP theNextSp);
|
||||||
|
@ -344,11 +352,6 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
refreshCacheWithRetry();
|
refreshCacheWithRetry();
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
public void setSearchParamProviderForUnitTest(ISearchParamProvider theSearchParamProvider) {
|
|
||||||
mySearchParamProvider = theSearchParamProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
int refreshCacheWithRetry() {
|
int refreshCacheWithRetry() {
|
||||||
Retrier<Integer> refreshCacheRetrier = new Retrier<>(() -> {
|
Retrier<Integer> refreshCacheRetrier = new Retrier<>(() -> {
|
||||||
synchronized (BaseSearchParamRegistry.this) {
|
synchronized (BaseSearchParamRegistry.this) {
|
||||||
|
@ -367,10 +370,12 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void refreshCacheIfNecessary() {
|
public boolean refreshCacheIfNecessary() {
|
||||||
if (myActiveSearchParams == null ||
|
if (myActiveSearchParams == null || System.currentTimeMillis() - REFRESH_INTERVAL > myLastRefresh) {
|
||||||
System.currentTimeMillis() - REFRESH_INTERVAL > myLastRefresh) {
|
|
||||||
refreshCacheWithRetry();
|
refreshCacheWithRetry();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +385,11 @@ public abstract class BaseSearchParamRegistry<SP extends IBaseResource> implemen
|
||||||
return Collections.unmodifiableMap(myActiveSearchParams);
|
return Collections.unmodifiableMap(myActiveSearchParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setSchedulerServiceForUnitTest(ISchedulerService theSchedulerService) {
|
||||||
|
mySchedulerService = theSchedulerService;
|
||||||
|
}
|
||||||
|
|
||||||
public static class SubmitJob implements Job {
|
public static class SubmitJob implements Job {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISearchParamRegistry myTarget;
|
private ISearchParamRegistry myTarget;
|
||||||
|
|
|
@ -41,7 +41,7 @@ public interface ISearchParamRegistry {
|
||||||
*/
|
*/
|
||||||
RuntimeSearchParam getActiveSearchParam(String theResourceName, String theParamName);
|
RuntimeSearchParam getActiveSearchParam(String theResourceName, String theParamName);
|
||||||
|
|
||||||
void refreshCacheIfNecessary();
|
boolean refreshCacheIfNecessary();
|
||||||
|
|
||||||
Map<String, Map<String, RuntimeSearchParam>> getActiveSearchParams();
|
Map<String, Map<String, RuntimeSearchParam>> getActiveSearchParams();
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamToken;
|
import ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamToken;
|
||||||
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
|
||||||
import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam;
|
import ca.uhn.fhir.jpa.searchparam.JpaRuntimeSearchParam;
|
||||||
import ca.uhn.fhir.jpa.searchparam.extractor.SearchParamExtractorDstu3;
|
|
||||||
import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry;
|
import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry;
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
import org.hl7.fhir.dstu3.hapi.ctx.DefaultProfileValidationSupport;
|
import org.hl7.fhir.dstu3.hapi.ctx.DefaultProfileValidationSupport;
|
||||||
|
@ -44,8 +43,9 @@ public class SearchParamExtractorDstu3Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void refreshCacheIfNecessary() {
|
public boolean refreshCacheIfNecessary() {
|
||||||
// nothing
|
// nothing
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
package ca.uhn.fhir.jpa.searchparam.registry;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.jpa.model.sched.ISchedulerService;
|
||||||
|
import ca.uhn.fhir.rest.server.SimpleBundleProvider;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.mockito.ArgumentMatchers.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
public class BaseSearchParamRegistryTest {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private ISchedulerService mySchedulerService;
|
||||||
|
@Mock
|
||||||
|
private ISearchParamProvider mySearchParamProvider;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRefreshAfterExpiry() {
|
||||||
|
when(mySearchParamProvider.search(any())).thenReturn(new SimpleBundleProvider());
|
||||||
|
|
||||||
|
SearchParamRegistryR4 registry = new SearchParamRegistryR4();
|
||||||
|
registry.setSchedulerServiceForUnitTest(mySchedulerService);
|
||||||
|
registry.setFhirContextForUnitTest(FhirContext.forR4());
|
||||||
|
registry.setSearchParamProviderForUnitTest(mySearchParamProvider);
|
||||||
|
registry.postConstruct();
|
||||||
|
|
||||||
|
registry.requestRefresh();
|
||||||
|
assertEquals(146, registry.doRefresh(100000));
|
||||||
|
|
||||||
|
// Second time we don't need to run because we ran recently
|
||||||
|
assertEquals(0, registry.doRefresh(100000));
|
||||||
|
|
||||||
|
assertEquals(146, registry.getActiveSearchParams().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRefreshCacheIfNeccessary() {
|
||||||
|
SearchParamRegistryR4 registry = new SearchParamRegistryR4();
|
||||||
|
|
||||||
|
when(mySearchParamProvider.search(any())).thenReturn(new SimpleBundleProvider());
|
||||||
|
when(mySearchParamProvider.refreshCache(any(), anyLong())).thenAnswer(t->{
|
||||||
|
registry.doRefresh(t.getArgument(1, Long.class));
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
registry.setSchedulerServiceForUnitTest(mySchedulerService);
|
||||||
|
registry.setFhirContextForUnitTest(FhirContext.forR4());
|
||||||
|
registry.setSearchParamProviderForUnitTest(mySearchParamProvider);
|
||||||
|
registry.postConstruct();
|
||||||
|
registry.requestRefresh();
|
||||||
|
|
||||||
|
assertTrue(registry.refreshCacheIfNecessary());
|
||||||
|
assertFalse(registry.refreshCacheIfNecessary());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue