protected List<ValueEval> fetchValuesWithOptimisations(
      DsLookupParameters parameters, OperationEvaluationContext ec) {
    DataSetOptimisationsCache caches =
        (DataSetOptimisationsCache)
            ec.getCustomEvaluationContext().get(DataSetOptimisationsCache.class);
    if (caches == null) {
      caches = this.external.getDataSetOptimisationsCache();
    }

    Cache<DsLookupParameters, List> cache = caches.getDataSetToDsLookupParameters();

    if (cache.containsKey(parameters)) {
      return cache.get(parameters);
    }

    return null;
  }
  protected void updateOptimisationsCache(
      DsLookupParameters parameters,
      IDataSet dataSet,
      List<ValueEval> fetchedValues,
      OperationEvaluationContext ec) {
    if (fetchedValues == null || parameters == null) {
      return;
    }

    DataSetOptimisationsCache caches =
        (DataSetOptimisationsCache)
            ec.getCustomEvaluationContext().get(DataSetOptimisationsCache.class);
    if (caches == null) {
      caches = this.external.getDataSetOptimisationsCache();
    }

    Cache<DsLookupParameters, List> cache = caches.getDataSetToDsLookupParameters();

    cache.put(parameters, fetchedValues);
  }