Exemplo n.º 1
0
 public OeCacheContext(OeQueryContext queryContext)
 {
     _odataUri  = queryContext.ODataUri;
     _entitySet = queryContext.EntitySet;
     _parseNavigationSegments = queryContext.ParseNavigationSegments;
     _metadataLevel           = queryContext.MetadataLevel;
     _navigationNextLink      = queryContext.NavigationNextLink;
     _skipTokenParser         = queryContext.SkipTokenParser;
 }
Exemplo n.º 2
0
        public async Task ExecuteAsync(ODataUri odataUri, Stream?requestStream, OeRequestHeaders headers, Stream responseStream, CancellationToken cancellationToken)
        {
            Object?dataContext = null;

            try
            {
                dataContext = _dataAdapter.CreateDataContext();
                IAsyncEnumerator <Object>?asyncEnumerator = null;
                try
                {
                    asyncEnumerator = GetAsyncEnumerable(odataUri, requestStream, headers, dataContext, cancellationToken, out bool isScalar).GetAsyncEnumerator(cancellationToken);
                    if (isScalar)
                    {
                        if (await asyncEnumerator.MoveNextAsync().ConfigureAwait(false) && asyncEnumerator.Current != null)
                        {
                            headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(asyncEnumerator.Current.ToString());
                            await responseStream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
                        }
                        else
                        {
                            headers.ResponseContentType = null;
                        }
                    }
                    else
                    {
                        var           importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
                        IEdmEntitySet?entitySet     = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());
                        if (entitySet == null)
                        {
                            await WriteCollectionAsync(_edmModel, odataUri, asyncEnumerator, responseStream).ConfigureAwait(false);
                        }
                        else
                        {
                            OeQueryContext queryContext = CreateQueryContext(odataUri, entitySet, headers.MetadataLevel);
                            await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, responseStream, _serviceProvider, cancellationToken).ConfigureAwait(false);
                        }
                    }
                }
                finally
                {
                    if (asyncEnumerator != null)
                    {
                        await asyncEnumerator.DisposeAsync().ConfigureAwait(false);
                    }
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    _dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
Exemplo n.º 3
0
        public IQueryable ApplyTo(IQueryable source, Object dataContext)
        {
            if (_expression == null)
            {
                return(source);
            }

            _source = source;
            Expression expression = OeQueryContext.TranslateSource(EdmModel, dataContext, _expression, GetQuerySource);

            return(source.Provider.CreateQuery(expression));
        }
Exemplo n.º 4
0
        public IQueryable ApplyTo(IQueryable source, Object dataContext)
        {
            if (_expression == null)
            {
                return(source);
            }

            IEdmEntitySet entitySet  = _entitySet;
            Expression    expression = OeQueryContext.TranslateSource(EdmModel, dataContext, _expression, e => e == entitySet ? source : null);

            return(source.Provider.CreateQuery(expression));
        }
Exemplo n.º 5
0
        public Expression ApplySelect(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                return(source);
            }

            var selectTranslator = new Translators.OeSelectTranslator(_joinBuilder, queryContext.ODataUri.Path, queryContext.MetadataLevel);

            source = selectTranslator.Build(source, queryContext);
            _entryFactoryFactory = selectTranslator.CreateEntryFactory;

            ChangeParameterType(source);
            return(source);
        }
Exemplo n.º 6
0
        public OeQueryExpression(IEdmModel edmModel, String query)
        {
            EdmModel = edmModel;

            ODataUri odataUri = OeParser.ParseUri(edmModel, new Uri(query, UriKind.Relative));

            _entitySet = ((EntitySetSegment)odataUri.Path.FirstSegment).EntitySet;

            var        queryContext = new OeQueryContext(edmModel, odataUri);
            Expression expression   = queryContext.CreateExpression(out _);

            _expression = OeEnumerableToQuerableVisitor.Translate(expression);

            EntryFactory = queryContext.EntryFactory;
        }
Exemplo n.º 7
0
        public async Task ExecuteAsync(ODataUri odataUri, OeRequestHeaders headers, Stream stream, CancellationToken cancellationToken)
        {
            if (_modelBoundProvider != null)
            {
                _modelBoundProvider.Validate(_edmModel, odataUri);
            }

            var queryContext = new OeQueryContext(_edmModel, odataUri)
            {
                MetadataLevel = headers.MetadataLevel
            };

            if (queryContext.ODataUri.Path.LastSegment is OperationSegment)
            {
                using (IAsyncEnumerator <Object> asyncEnumerator = OeOperationHelper.ApplyBoundFunction(queryContext).GetEnumerator())
                    await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream, cancellationToken).ConfigureAwait(false);

                return;
            }

            Object dataContext = null;

            Db.OeDataAdapter dataAdapter = queryContext.EdmModel.GetDataAdapter(queryContext.EdmModel.EntityContainer);
            try
            {
                dataContext = dataAdapter.CreateDataContext();
                if (odataUri.Path.LastSegment is CountSegment)
                {
                    headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                    int    count  = dataAdapter.ExecuteScalar <int>(dataContext, queryContext);
                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(count.ToString(CultureInfo.InvariantCulture));
                    stream.Write(buffer, 0, buffer.Length);
                }
                else
                {
                    using (IAsyncEnumerator <Object> asyncEnumerator = dataAdapter.Execute(dataContext, queryContext).GetEnumerator())
                        await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream, cancellationToken).ConfigureAwait(false);
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
Exemplo n.º 8
0
        public async Task ExecuteAsync(ODataUri odataUri, Stream requestStream, OeRequestHeaders headers, Stream responseStream, CancellationToken cancellationToken)
        {
            Object dataContext = null;

            try
            {
                dataContext = _dataAdapter.CreateDataContext();
                using (IAsyncEnumerator <Object> asyncEnumerator = GetAsyncEnumerable(odataUri, requestStream, headers, dataContext, out bool isScalar).GetEnumerator())
                {
                    if (isScalar)
                    {
                        if (await asyncEnumerator.MoveNext(cancellationToken).ConfigureAwait(false) && asyncEnumerator.Current != null)
                        {
                            headers.ResponseContentType = OeRequestHeaders.TextDefault.ContentType;
                            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(asyncEnumerator.Current.ToString());
                            responseStream.Write(buffer, 0, buffer.Length);
                        }
                        else
                        {
                            headers.ResponseContentType = null;
                        }
                    }
                    else
                    {
                        OeQueryContext queryContext = CreateQueryContext(odataUri, headers.MetadataLevel);
                        if (queryContext == null)
                        {
                            await WriteCollectionAsync(_edmModel, odataUri, asyncEnumerator, responseStream, cancellationToken).ConfigureAwait(false);
                        }
                        else
                        {
                            await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, responseStream, cancellationToken).ConfigureAwait(false);
                        }
                    }
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    _dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
Exemplo n.º 9
0
        public Expression ApplySelect(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.Path.LastSegment is CountSegment)
            {
                return(source);
            }

            var selectTranslator           = new Translators.OeSelectTranslator(queryContext.EdmModel, _joinBuilder, queryContext.ODataUri);
            var selectTranslatorParameters = new Translators.OeSelectTranslatorParameters()
            {
                IsDatabaseNullHighestValue = queryContext.IsDatabaseNullHighestValue,
                MetadataLevel       = queryContext.MetadataLevel,
                SkipTokenNameValues = queryContext.SkipTokenNameValues
            };

            source = selectTranslator.Build(source, ref selectTranslatorParameters, out _entryFactoryFactory);

            ChangeParameterType(source);
            return(source);
        }
        public Expression ApplySelect(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.SelectAndExpand == null && (queryContext.ODataUri.OrderBy == null || queryContext.PageSize == 0))
            {
                return(source);
            }

            var        selectTranslator = new OeSelectTranslator(_visitor, queryContext.ODataUri.Path);
            Expression selectExpression = selectTranslator.Build(source, queryContext);

            if (selectExpression == null)
            {
                return(source);
            }

            _entryFactory = selectTranslator.CreateEntryFactory;

            Type selectItemType = OeExpressionHelper.GetCollectionItemType(selectExpression.Type);

            _visitor = new OeQueryNodeVisitor(_model, Expression.Parameter(selectItemType), _visitor.Constans);

            return(selectExpression);
        }
Exemplo n.º 11
0
        public Expression Build(Expression source, OeQueryContext queryContext)
        {
            if (queryContext.ODataUri.SelectAndExpand != null)
            {
                BuildSelect(queryContext.ODataUri.SelectAndExpand, source, _visitor.Parameter, queryContext.MetadataLevel, queryContext.NavigationNextLink);
            }

            if (queryContext.ODataUri.Compute != null)
            {
                BuildCompute(queryContext.ODataUri.Compute);
            }

            if (queryContext.ODataUri.OrderBy != null)
            {
                BuildOrderBy(queryContext.ODataUri.OrderBy);
            }

            if (_selectItemInfos.Count == 0)
            {
                return(null);
            }

            return(CreateSelectExpression(source, _visitor.Parameter));
        }
Exemplo n.º 12
0
        public Expression Build(Expression source, OeQueryContext queryContext)
        {
            OrderByClause      orderBy         = queryContext.ODataUri.OrderBy;
            SelectExpandClause selectAndExpand = queryContext.ODataUri.SelectAndExpand;
            ComputeClause      compute         = queryContext.ODataUri.Compute;

            if (selectAndExpand != null)
            {
                BuildSelect(selectAndExpand, source, _visitor.Parameter, queryContext.MetadataLevel, queryContext.NavigationNextLink);
            }

            if (compute != null)
            {
                BuildCompute(compute);
            }

            if (orderBy != null)
            {
                BuildOrderBy(orderBy);
            }

            if (_selectItemInfos.Count == 0 && queryContext.SkipTokenParser != null)
            {
                queryContext.SkipTokenParser.Accessors = GetAccessors(source, orderBy);
                return(null);
            }

            var selectExpression = CreateSelectExpression(source, _visitor.Parameter);

            if (queryContext.SkipTokenParser != null)
            {
                queryContext.SkipTokenParser.Accessors = GetAccessors(selectExpression, orderBy);
            }

            return(selectExpression);
        }
Exemplo n.º 13
0
        public static Expression GetExpression(IEdmModel edmModel, String query, IQueryable source)
        {
            var queryExpression = new OeQueryExpression(edmModel, query);

            return(OeQueryContext.TranslateSource(edmModel, null, queryExpression._expression, e => source));
        }
Exemplo n.º 14
0
 public OeCacheContext(OeQueryContext queryContext, IReadOnlyDictionary <ConstantNode, Db.OeQueryCacheDbParameterDefinition> constantToParameterMapper)
     : this(queryContext)
 {
     _constantToParameterMapper = constantToParameterMapper;
 }