/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.function; import java.util.Collection; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.threeten.bp.Instant; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.value.ComputedValue; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.util.ArgumentChecker; /** * An in-memory implementation of {@link CompiledFunctionRepository}. */ public class InMemoryCompiledFunctionRepository implements CompiledFunctionRepository { private static final FunctionInvoker MISSING = new FunctionInvoker() { @Override public Set<ComputedValue> execute(FunctionExecutionContext executionContext, FunctionInputs inputs, ComputationTarget target, Set<ValueRequirement> desiredValues) { return null; } @Override public boolean canHandleMissingInputs() { return false; } }; private final ConcurrentMap<String, CompiledFunctionDefinition> _functionDefinitions = new ConcurrentHashMap<String, CompiledFunctionDefinition>(); private final ConcurrentMap<String, FunctionInvoker> _functionInvokers = new ConcurrentHashMap<String, FunctionInvoker>(); private final FunctionCompilationContext _compilationContext; private Instant _earliestInvocationTime; private Instant _latestInvocationTime; public InMemoryCompiledFunctionRepository(final FunctionCompilationContext compilationContext) { _compilationContext = compilationContext; } public void addFunction(final CompiledFunctionDefinition function) { ArgumentChecker.notNull(function, "Function definition"); final String uid = function.getFunctionDefinition().getUniqueId(); _functionDefinitions.put(uid, function); Instant time = function.getEarliestInvocationTime(); if (time != null) { if (_earliestInvocationTime != null) { if (time.isAfter(_earliestInvocationTime)) { _earliestInvocationTime = time; } } else { _earliestInvocationTime = time; } } time = function.getLatestInvocationTime(); if (time != null) { if (_latestInvocationTime != null) { if (time.isBefore(_latestInvocationTime)) { _latestInvocationTime = time; } } else { _latestInvocationTime = time; } } } @Override public Collection<CompiledFunctionDefinition> getAllFunctions() { return _functionDefinitions.values(); } @Override public CompiledFunctionDefinition getDefinition(final String uniqueId) { return findDefinition(uniqueId); } /** * Separate "find" operation that can be used to bypass a sub-class implementation that may * be doing some form of lazy compilation of function definitions. * @param uniqueId the definition identifier, not null * @return the definition */ public CompiledFunctionDefinition findDefinition(final String uniqueId) { return _functionDefinitions.get(uniqueId); } @Override public FunctionInvoker getInvoker(final String uniqueId) { FunctionInvoker invoker = _functionInvokers.get(uniqueId); if (invoker == null) { final CompiledFunctionDefinition definition = getDefinition(uniqueId); if (definition == null) { invoker = MISSING; } else { invoker = definition.getFunctionInvoker(); } final FunctionInvoker previous = _functionInvokers.putIfAbsent(uniqueId, invoker); if (previous != null) { invoker = previous; } } return (invoker == MISSING) ? null : invoker; } @Override public FunctionCompilationContext getCompilationContext() { return _compilationContext; } public Instant getEarliestInvocationTime() { return _earliestInvocationTime; } public Instant getLatestInvocationTime() { return _latestInvocationTime; } }