// ------------------------------------------------------------------------- private EngineResourceReference<SingleComputationCycle> createCycle( ViewCycleExecutionOptions executionOptions, CompiledViewDefinitionWithGraphsImpl compiledViewDefinition, VersionCorrection versionCorrection) { // View definition was compiled based on compilation options, which might have only included an // indicative // valuation time. A further check ensures that the compiled view definition is still valid. if (!compiledViewDefinition.isValidFor(executionOptions.getValuationTime())) { throw new OpenGammaRuntimeException( "Compiled view definition " + compiledViewDefinition + " not valid for execution options " + executionOptions); } UniqueId cycleId = getViewProcess().generateCycleId(); ComputationResultListener streamingResultListener = new ComputationResultListener() { @Override public void resultAvailable(ViewComputationResultModel result) { cycleFragmentCompleted(result); } }; SingleComputationCycle cycle = new SingleComputationCycle( cycleId, getViewProcess().getUniqueId(), streamingResultListener, getProcessContext(), compiledViewDefinition, executionOptions, versionCorrection); return getCycleManager().manage(cycle); }
private CompiledViewDefinitionWithGraphsImpl getCompiledViewDefinition( Instant valuationTime, VersionCorrection versionCorrection) { long functionInitId = getProcessContext() .getFunctionCompilationService() .getFunctionCompilationContext() .getFunctionInitId(); CompiledViewDefinitionWithGraphsImpl compiledViewDefinition; updateViewDefinitionIfRequired(); if (_compilationDirty) { _compilationDirty = false; invalidateCachedCompiledViewDefinition(); compiledViewDefinition = null; } else { compiledViewDefinition = getCachedCompiledViewDefinition(); } if (compiledViewDefinition != null && compiledViewDefinition.isValidFor(valuationTime) && functionInitId == compiledViewDefinition.getFunctionInitId()) { // Existing cached model is valid (an optimisation for the common case of similar, increasing // valuation times) return compiledViewDefinition; } try { MarketDataAvailabilityProvider availabilityProvider = getMarketDataProvider().getAvailabilityProvider(); ViewCompilationServices compilationServices = getProcessContext().asCompilationServices(availabilityProvider); compiledViewDefinition = ViewDefinitionCompiler.compile( _viewDefinition, compilationServices, valuationTime, versionCorrection); if (isTerminated()) { return compiledViewDefinition; // [PLAT-1904] If we can't terminate the compilation at least // avoid doing the subscribe etc. } } catch (Exception e) { String message = MessageFormat.format( "Error compiling view definition {0} for time {1}", getViewProcess().getDefinitionId(), valuationTime); viewDefinitionCompilationFailed(valuationTime, new OpenGammaRuntimeException(message, e)); throw new OpenGammaRuntimeException(message, e); } setCachedCompiledViewDefinition(compiledViewDefinition); // [PLAT-984] // Assume that valuation times are increasing in real-time towards the expiry of the view // definition, so that we // can predict the time to expiry. If this assumption is wrong then the worst we do is trigger // an unnecessary // cycle. In the predicted case, we trigger a cycle on expiry so that any new market data // subscriptions are made // straight away. if (compiledViewDefinition.getValidTo() != null) { Duration durationToExpiry = getMarketDataProvider() .getRealTimeDuration(valuationTime, compiledViewDefinition.getValidTo()); long expiryNanos = System.nanoTime() + durationToExpiry.toNanosLong(); _compilationExpiryCycleTrigger.set(expiryNanos, ViewCycleTriggerResult.forceFull()); } else { _compilationExpiryCycleTrigger.reset(); } // Notify the view that a (re)compilation has taken place before going on to do any // time-consuming work. // This might contain enough for clients to e.g. render an empty grid in which results will // later appear. viewDefinitionCompiled(compiledViewDefinition); // Update the market data subscriptions to whatever is now required, ensuring the computation // cycle can find the // required input data when it is executed. setMarketDataSubscriptions(compiledViewDefinition.getMarketDataRequirements().keySet()); return compiledViewDefinition; }