/// <summary> Performs the query requested. </summary>
        /// <param name="context"></param>
        protected override void DoWork(CodeActivityContext context)
        {
            //Get argument values.
            ImpacPersistenceManager pm = PersistenceManager.Expression != null
                                             ? PersistenceManager.Get(context)
                                             : PM;

            QueryStrategy strategy = Strategy.Get(context) ?? QueryStrategy.Normal;
            string        sqlQuery = Query.Get(context);

            //Defect-11131:Medication field in eScribe get error when the PC Regional Settings are changed to DD/MM/YY--Check the MAX date format, if exist possible issue format, change the format to standard format.
            if ((sqlQuery.IndexOf(DateTime.MaxValue.ToString("dd/MM/yyyy")) > 0) || (sqlQuery.IndexOf(DateTime.MaxValue.ToString("MM/dd/yyyy")) > 0))
            {
                if (sqlQuery.IndexOf(DateTime.MaxValue.ToString("dd/MM/yyyy")) > 0)
                {
                    sqlQuery = sqlQuery.Replace(DateTime.MaxValue.ToString("dd/MM/yyyy"), DateTime.MaxValue.ToString("yyyy/MM/dd"));
                }
                if (sqlQuery.IndexOf(DateTime.MaxValue.ToString("MM/dd/yyyy")) > 0)
                {
                    sqlQuery = sqlQuery.Replace(DateTime.MaxValue.ToString("MM/dd/yyyy"), DateTime.MaxValue.ToString("yyyy/MM/dd"));
                }
            }
            //Create and execute the query
            var            passthroughQuery = new PassthruRdbQuery(typeof(T), sqlQuery);
            EntityList <T> entities         = pm.GetEntities <T>(passthroughQuery, strategy);

            //Assign the result set.
            Result.Set(context, entities);
        }
        public void SetUp()
        {
            _indexedEventOne = SupportEventBeanFactory.MakeEvents(new String[] { "s1_1", "s1_2" });
            _indexedEventTwo = SupportEventBeanFactory.MakeEvents(new String[] { "s2_1", "s2_2" });

            _newEventOne = SupportEventBeanFactory.MakeEvents(new String[] { "s1_3" });
            _newEventTwo = SupportEventBeanFactory.MakeEvents(new String[] { "s2_3" });

            _indexLeft = new UnindexedEventTableImpl(1);
            _indexLeft.Add(_indexedEventOne);
            _indexRight = new UnindexedEventTableImpl(1);
            _indexRight.Add(_indexedEventTwo);

            var queryStrategies = new QueryStrategy[2];
            var lookupLeft      = new TableLookupExecNode(1, new FullTableScanLookupStrategy(_indexRight));
            var lookupRight     = new TableLookupExecNode(0, new FullTableScanLookupStrategy(_indexLeft));

            queryStrategies[0] = new ExecNodeQueryStrategy(0, 2, lookupLeft);
            queryStrategies[1] = new ExecNodeQueryStrategy(1, 2, lookupRight);

            var indexes = new IDictionary <TableLookupIndexReqKey, EventTable> [2];

            indexes[0] = new NullableDictionary <TableLookupIndexReqKey, EventTable>();
            indexes[1] = new NullableDictionary <TableLookupIndexReqKey, EventTable>();
            indexes[0].Put(new TableLookupIndexReqKey("idxLeft"), _indexLeft);
            indexes[1].Put(new TableLookupIndexReqKey("idxLeft"), _indexRight);

            _joinSetComposerImpl = new JoinSetComposerImpl(true, indexes, queryStrategies, false, null, true);
        }
Beispiel #3
0
        public JoinSetComposerStreamToWinImpl(
            bool allowInitIndex,
            IDictionary<TableLookupIndexReqKey, EventTable>[] repositories,
            bool isPureSelfJoin,
            int streamNumber,
            QueryStrategy queryStrategy,
            bool[] selfJoinRepositoryResets)
        {
            this.allowInitIndex = allowInitIndex;
            this.repositories = JoinSetComposerUtil.ToArray(repositories);
            this.streamNumber = streamNumber;
            this.queryStrategy = queryStrategy;

            this.selfJoinRepositoryResets = selfJoinRepositoryResets;
            if (isPureSelfJoin) {
                isResetSelfJoinRepositories = true;
                CompatExtensions.Fill(selfJoinRepositoryResets, true);
            }
            else {
                var flag = false;
                foreach (var selfJoinRepositoryReset in selfJoinRepositoryResets) {
                    flag |= selfJoinRepositoryReset;
                }

                isResetSelfJoinRepositories = flag;
            }
        }
Beispiel #4
0
        /// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="allowInitIndex">if set to <c>true</c> [allow initialize index].</param>
        /// <param name="repositories">for each stream an array of (indexed/unindexed) tables for lookup.</param>
        /// <param name="isPureSelfJoin">for self-joins</param>
        /// <param name="streamNumber">is the undirectional stream</param>
        /// <param name="queryStrategy">is the lookup query strategy for the stream</param>
        /// <param name="selfJoinRepositoryResets">indicators for any stream's table that reset after strategy executon</param>
        public JoinSetComposerStreamToWinImpl(
            bool allowInitIndex,
            IDictionary <TableLookupIndexReqKey, EventTable>[] repositories,
            bool isPureSelfJoin,
            int streamNumber,
            QueryStrategy queryStrategy,
            bool[] selfJoinRepositoryResets)
        {
            _allowInitIndex = allowInitIndex;
            _repositories   = JoinSetComposerUtil.ToArray(repositories);
            _streamNumber   = streamNumber;
            _queryStrategy  = queryStrategy;

            _selfJoinRepositoryResets = selfJoinRepositoryResets;
            if (isPureSelfJoin)
            {
                _isResetSelfJoinRepositories = true;
                selfJoinRepositoryResets.Fill(true);
            }
            else
            {
                bool flag = false;
                foreach (bool selfJoinRepositoryReset in selfJoinRepositoryResets)
                {
                    flag |= selfJoinRepositoryReset;
                }
                _isResetSelfJoinRepositories = flag;
            }
        }
        public JoinSetComposerDesc Create(
            Viewable[] streamViews,
            bool isFireAndForget,
            AgentInstanceContext agentInstanceContext)
        {
            var queryStrategies = new QueryStrategy[_streamTypes.Length];

            var viewable = (HistoricalEventViewable)streamViews[_polledViewNum];
            var outerJoinEqualsNodeEval = _outerJoinEqualsNode == null
                ? null
                : _outerJoinEqualsNode.ExprEvaluator;

            queryStrategies[_streamViewNum] = new HistoricalDataQueryStrategy(
                _streamViewNum, _polledViewNum, viewable, _isOuterJoin, outerJoinEqualsNodeEval,
                _indexStrategies.First, _indexStrategies.Second);

            // for strictly historical joins, create a query strategy for the non-subordinate historical view
            if (_isAllHistoricalNoSubordinate)
            {
                var isOuterJoin = false;
                if (_outerJoinDescList.Length > 0)
                {
                    var outerJoinDesc = _outerJoinDescList[0];
                    if (outerJoinDesc.OuterJoinType.Equals(OuterJoinType.FULL))
                    {
                        isOuterJoin = true;
                    }
                    else if ((outerJoinDesc.OuterJoinType.Equals(OuterJoinType.LEFT)) &&
                             (_polledViewNum == 0))
                    {
                        isOuterJoin = true;
                    }
                    else if ((outerJoinDesc.OuterJoinType.Equals(OuterJoinType.RIGHT)) &&
                             (_polledViewNum == 1))
                    {
                        isOuterJoin = true;
                    }
                }
                viewable = (HistoricalEventViewable)streamViews[_streamViewNum];
                queryStrategies[_polledViewNum] = new HistoricalDataQueryStrategy(
                    _polledViewNum, _streamViewNum, viewable, isOuterJoin, outerJoinEqualsNodeEval,
                    new HistoricalIndexLookupStrategyNoIndex(), new PollResultIndexingStrategyNoIndex());
            }

            JoinSetComposer composer = new JoinSetComposerHistoricalImpl(
                null, queryStrategies, streamViews, _exprEvaluatorContext);
            var postJoinEval = _optionalFilterNode == null ? null : _optionalFilterNode.ExprEvaluator;

            return(new JoinSetComposerDesc(composer, postJoinEval));
        }
Beispiel #6
0
        /// <summary> Performs the query requested. </summary>
        /// <param name="context"></param>
        protected override void DoWork(CodeActivityContext context)
        {
            //Get argument values
            //Get argument values.
            ImpacPersistenceManager pm = PersistenceManager.Expression != null
                                             ? PersistenceManager.Get(context)
                                             : PM;

            QueryStrategy strategy = Strategy.Get(context) ?? QueryStrategy.Normal;
            object        key      = PrimaryKey.Get(context);

            //Execute the query and return the result.
            Entity entity = pm.GetEntity <T>(new PrimaryKey(typeof(T), key), strategy);

            Result.Set(context, entity);
        }
Beispiel #7
0
        /// <summary>
        /// Performs the query.
        /// </summary>
        /// <param name="context"></param>
        protected override void DoWork(CodeActivityContext context)
        {
            //Get arguments
            //Get argument values.
            ImpacPersistenceManager pm = PersistenceManager.Expression != null
                                             ? PersistenceManager.Get(context)
                                             : PM;

            QueryStrategy strategy = Strategy.Get(context) ?? QueryStrategy.Normal;
            string        sqlQuery = Query.Get(context);

            //Run query and set results.
            var passthroughQuery = new PassthruRdbQuery(typeof(T), sqlQuery);
            var entity           = pm.GetEntity <T>(passthroughQuery, strategy);

            Result.Set(context, entity);
        }
        public static OperationNode Build(QueryPlanContext context)
        {
            var root = new SequenceNode {
                CancelOnError = true
            };

            context.Root = root;
            context.NodePath.Push(root);

            foreach (ISelection mutation in context.Operation.GetRootSelectionSet().Selections)
            {
                context.SelectionPath.Push(mutation);

                var mutationStep = new ResolverNode(
                    mutation,
                    context.SelectionPath.PeekOrDefault(),
                    GetStrategyFromSelection(mutation));

                root.AddNode(mutationStep);

                QueryStrategy.VisitChildren(mutation, context);
            }

            context.NodePath.Pop();

            QueryPlanNode optimized     = QueryStrategy.Optimize(context.Root);
            var           operationNode = new OperationNode(optimized);

            if (context.Deferred.Count > 0)
            {
                foreach (QueryPlanNode?deferred in QueryStrategy.BuildDeferred(context))
                {
                    operationNode.Deferred.Add(deferred);
                }
            }

            if (context.Streams.Count > 0)
            {
                operationNode.Streams.AddRange(context.Streams.Values);
            }

            return(operationNode);
        }
        public JoinSetComposerDesc Create(Viewable[] streamViews, bool isFireAndForget, AgentInstanceContext agentInstanceContext)
        {
            // Build indexes
            var indexesPerStream         = new IDictionary <TableLookupIndexReqKey, EventTable> [_indexSpecs.Length];
            var tableSecondaryIndexLocks = new ILockable[_indexSpecs.Length];
            var hasTable = false;

            for (var streamNo = 0; streamNo < _indexSpecs.Length; streamNo++)
            {
                if (_indexSpecs[streamNo] == null)
                {
                    continue;
                }

                var items = _indexSpecs[streamNo].Items;
                indexesPerStream[streamNo] = new LinkedHashMap <TableLookupIndexReqKey, EventTable>();

                if (_streamJoinAnalysisResult.TablesPerStream[streamNo] != null)
                {
                    // build for tables
                    var metadata = _streamJoinAnalysisResult.TablesPerStream[streamNo];
                    var state    = _tableService.GetState(metadata.TableName, agentInstanceContext.AgentInstanceId);
                    foreach (var indexName in state.SecondaryIndexes)       // add secondary indexes
                    {
                        var eventTable = state.GetIndex(indexName);
                        indexesPerStream[streamNo].Put(new TableLookupIndexReqKey(indexName, metadata.TableName), eventTable);
                    }
                    var index = state.GetIndex(metadata.TableName);     // add primary index
                    indexesPerStream[streamNo].Put(new TableLookupIndexReqKey(metadata.TableName, metadata.TableName), index);
                    hasTable = true;
                    tableSecondaryIndexLocks[streamNo] = agentInstanceContext.StatementContext.IsWritesToTables
                        ? state.TableLevelRWLock.WriteLock
                        : state.TableLevelRWLock.ReadLock;
                }
                else
                {
                    // build tables for implicit indexes
                    foreach (var entry in items)
                    {
                        EventTable index;
                        if (_streamJoinAnalysisResult.ViewExternal[streamNo] != null)
                        {
                            var view = _streamJoinAnalysisResult.ViewExternal[streamNo].Invoke(agentInstanceContext);
                            index = view.GetJoinIndexTable(items.Get(entry.Key));
                        }
                        else
                        {
                            index = EventTableUtil.BuildIndex(streamNo, items.Get(entry.Key), _streamTypes[streamNo], false, entry.Value.IsUnique, null);
                        }
                        indexesPerStream[streamNo].Put(entry.Key, index);
                    }
                }
            }

            // obtain any external views
            var externalViewProviders = _streamJoinAnalysisResult.ViewExternal;
            var externalViews         = new VirtualDWView[externalViewProviders.Length];

            for (var i = 0; i < externalViews.Length; i++)
            {
                if (externalViewProviders[i] != null)
                {
                    externalViews[i] = _streamJoinAnalysisResult.ViewExternal[i].Invoke(agentInstanceContext);
                }
            }

            // Build strategies
            var queryExecSpecs  = _queryPlan.ExecNodeSpecs;
            var queryStrategies = new QueryStrategy[queryExecSpecs.Length];

            for (var i = 0; i < queryExecSpecs.Length; i++)
            {
                var planNode = queryExecSpecs[i];
                if (planNode == null)
                {
                    Log.Debug(".makeComposer No execution node for stream " + i + " '" + _streamNames[i] + "'");
                    continue;
                }

                var executionNode = planNode.MakeExec(_statementName, _statementId, _annotations, indexesPerStream, _streamTypes, streamViews, _historicalStreamIndexLists, externalViews, tableSecondaryIndexLocks);

                if (Log.IsDebugEnabled)
                {
                    Log.Debug(".makeComposer Execution nodes for stream " + i + " '" + _streamNames[i] +
                              "' : \n" + ExecNode.Print(executionNode));
                }

                queryStrategies[i] = new ExecNodeQueryStrategy(i, _streamTypes.Length, executionNode);
            }

            // Remove indexes that are from tables as these are only available to query strategies
            if (hasTable)
            {
                indexesPerStream = RemoveTableIndexes(indexesPerStream, _streamJoinAnalysisResult.TablesPerStream);
            }

            // If this is not unidirectional and not a self-join (excluding self-outer-join)
            JoinSetComposerDesc joinSetComposerDesc;

            if ((!_streamJoinAnalysisResult.IsUnidirectional) &&
                (!_streamJoinAnalysisResult.IsPureSelfJoin || _outerJoinDescList.Length > 0))
            {
                JoinSetComposer composer;
                if (_historicalViewableDesc.HasHistorical)
                {
                    composer = new JoinSetComposerHistoricalImpl(indexesPerStream, queryStrategies, streamViews, _exprEvaluatorContext);
                }
                else
                {
                    if (isFireAndForget)
                    {
                        composer = new JoinSetComposerFAFImpl(indexesPerStream, queryStrategies, _streamJoinAnalysisResult.IsPureSelfJoin, _exprEvaluatorContext, _joinRemoveStream, _isOuterJoins);
                    }
                    else
                    {
                        composer = new JoinSetComposerImpl(indexesPerStream, queryStrategies, _streamJoinAnalysisResult.IsPureSelfJoin, _exprEvaluatorContext, _joinRemoveStream);
                    }
                }

                // rewrite the filter expression for all-inner joins in case "on"-clause outer join syntax was used to include those expressions
                var filterExpression = GetFilterExpressionInclOnClause(_optionalFilterNode, _outerJoinDescList);

                var postJoinEval = filterExpression == null ? null : filterExpression.ExprEvaluator;
                joinSetComposerDesc = new JoinSetComposerDesc(composer, postJoinEval);
            }
            else
            {
                QueryStrategy driver;
                int           unidirectionalStream;
                if (_streamJoinAnalysisResult.UnidirectionalStreamNumber != -1)
                {
                    unidirectionalStream = _streamJoinAnalysisResult.UnidirectionalStreamNumber;
                    driver = queryStrategies[unidirectionalStream];
                }
                else
                {
                    unidirectionalStream = 0;
                    driver = queryStrategies[0];
                }

                JoinSetComposer composer = new JoinSetComposerStreamToWinImpl(indexesPerStream, _streamJoinAnalysisResult.IsPureSelfJoin,
                                                                              unidirectionalStream, driver, _streamJoinAnalysisResult.UnidirectionalNonDriving);
                var postJoinEval = _optionalFilterNode == null ? null : _optionalFilterNode.ExprEvaluator;
                joinSetComposerDesc = new JoinSetComposerDesc(composer, postJoinEval);
            }

            // compile prior events per stream to preload any indexes
            var eventsPerStream = new EventBean[_streamNames.Length][];
            var events          = new List <EventBean>();

            for (var i = 0; i < eventsPerStream.Length; i++)
            {
                // For named windows and tables, we don't need to preload indexes from the iterators as this is always done already
                if (_streamJoinAnalysisResult.NamedWindow[i] || _streamJoinAnalysisResult.TablesPerStream[i] != null)
                {
                    continue;
                }

                IEnumerator <EventBean> en = null;
                if (!(streamViews[i] is HistoricalEventViewable) && !(streamViews[i] is DerivedValueView))
                {
                    try
                    {
                        en = streamViews[i].GetEnumerator();
                    }
                    catch (UnsupportedOperationException)
                    {
                        // Joins do not support the iterator
                    }
                }

                if (en != null)
                {
                    while (en.MoveNext())
                    {
                        events.Add(en.Current);
                    }
                    eventsPerStream[i] = events.ToArray();
                    events.Clear();
                }
                else
                {
                    eventsPerStream[i] = new EventBean[0];
                }
            }

            // init
            joinSetComposerDesc.JoinSetComposer.Init(eventsPerStream);

            return(joinSetComposerDesc);
        }
Beispiel #10
0
 private static OperationNode Prepare(QueryPlanContext context)
 {
     return(context.Operation.Definition.Operation is OperationType.Mutation
         ? MutationStrategy.Build(context)
         : QueryStrategy.Build(context));
 }
Beispiel #11
0
 /// <summary>
 ///     Creates a new repository.
 /// </summary>
 /// <param name="entityManagerProvider"> The EntityMangerProvider to be used to obtain an EntityManager. </param>
 /// <param name="defaultQueryStrategy"> The optional default query strategy. </param>
 public PagerRepository(IEntityManagerProvider entityManagerProvider, QueryStrategy defaultQueryStrategy = null)
     : base(entityManagerProvider, defaultQueryStrategy)
 {
 }