Esempio n. 1
0
        public async Task ExecuteResultAsync(ActionContext context)
        {
            var settings = new ODataMessageWriterSettings()
            {
                BaseUri = _odataUri.ServiceRoot,
                EnableMessageStreamDisposal = false,
                ODataUri    = _odataUri,
                Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames,
                Version     = ODataVersion.V4
            };

            var requestHeaders = OeRequestHeaders.Parse(context.HttpContext.Request.Headers["Accept"], context.HttpContext.Request.Headers["Prefer"]);

            _metadataLevel = requestHeaders.MetadataLevel;
            if (requestHeaders.MaxPageSize > 0 && PageSize == 0)
            {
                PageSize = requestHeaders.MaxPageSize;
            }

            IODataResponseMessage responseMessage = new OeInMemoryMessage(context.HttpContext.Response.Body, context.HttpContext.Request.ContentType);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, _edmModel))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet);

                IEdmEntitySet  edmEntitySet  = OeEdmClrHelper.GetEntitySet(_edmModel, typeof(T));
                IEdmEntityType edmEntityType = edmEntitySet.EntityType();
                ODataWriter    writer        = messageWriter.CreateODataResourceSetWriter(edmEntitySet, edmEntityType);
                await SerializeAsync(writer);
            }
        }
Esempio n. 2
0
        private async Task SerializeAsync(ODataWriter writer, OeMetadataLevel metadataLevel)
        {
            ClrPropertiesInfo clrPropertiesInfo = GetClrPropertiesInfo(_edmModel, _odataUri.SelectAndExpand, metadataLevel, typeof(T), null);

            var resourceSet = new ODataResourceSet()
            {
                Count = Count
            };

            writer.WriteStart(resourceSet);

            int count  = 0;
            T   entity = default;

            while (await _entities.MoveNext())
            {
                entity = _entities.Current;
                _stack.Add(entity);
                WriteEntry(writer, entity, clrPropertiesInfo);
                _stack.Remove(entity);
                count++;
            }

            if (PageSize > 0 && count > 0 && (Count ?? Int32.MaxValue) > count)
            {
                resourceSet.NextPageLink = BuildNextPageLink(OeSkipTokenParser.GetSkipToken(_edmModel, GetKeys(entity)));
            }

            writer.WriteEnd();
        }
        private void BuildSelect(SelectExpandClause selectClause, Expression source, ParameterExpression parameter,
                                 OeMetadataLevel metadataLevel, bool navigationNextLink)
        {
            foreach (SelectItem selectItem in selectClause.SelectedItems)
            {
                var            selectItemTranslator = new SelectItemTranslator(_visitor, _path, metadataLevel, navigationNextLink, parameter, source);
                SelectItemInfo selectItemInfo       = selectItem.TranslateWith(selectItemTranslator);
                if (selectItemInfo == null || SelectItemInfoExists(selectItemInfo.EdmProperty))
                {
                    continue;
                }

                _selectItemInfos.Add(selectItemInfo);
            }

            if (_selectItemInfos.Any(i => i.PropertySelect))
            {
                if (metadataLevel == OeMetadataLevel.Full)
                {
                    AddKey(parameter);
                }
            }
            else
            {
                _selectItemInfos.Insert(0, new SelectItemInfo(parameter));
            }
        }
Esempio n. 4
0
        internal OeQueryContext(IEdmModel edmModel, ODataUri odataUri,
                                IEdmEntitySet entitySet, IReadOnlyList <OeParseNavigationSegment> parseNavigationSegments,
                                bool isCountSegment, int pageSize, bool navigationNextLink, bool isDatabaseNullHighestValue,
                                OeMetadataLevel metadataLevel, Db.OeEntitySetAdapter entitySetAdapter)
        {
            EntitySetAdapter           = entitySetAdapter;
            EdmModel                   = edmModel;
            ODataUri                   = odataUri;
            EntitySet                  = entitySet;
            ParseNavigationSegments    = parseNavigationSegments;
            IsCountSegment             = isCountSegment;
            PageSize                   = pageSize;
            NavigationNextLink         = navigationNextLink;
            IsDatabaseNullHighestValue = isDatabaseNullHighestValue;
            MetadataLevel              = metadataLevel;

            var visitor = new OeQueryNodeVisitor(edmModel, Expression.Parameter(entitySetAdapter.EntityType));

            JoinBuilder = new Translators.OeJoinBuilder(visitor);

            if (pageSize > 0 || (odataUri.OrderBy != null && odataUri.Skip != null && odataUri.Top != null))
            {
                SkipTokenNameValues = OeSkipTokenParser.CreateNameValues(edmModel, odataUri.OrderBy, odataUri.SkipToken);
            }
        }
Esempio n. 5
0
 internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem)
 {
     _joinBuilder    = joinBuilder;
     _navigationItem = navigationItem;
     _visitor        = joinBuilder.Visitor;
     _metadataLevel  = OeMetadataLevel.None;
 }
Esempio n. 6
0
        private OeRequestHeaders(OeMetadataLevel metadataLevel, bool streaming, String charset)
        {
            _metadataLevel = metadataLevel;
            _streaming     = streaming;
            _charset       = charset;

            _contentType = GetContentType(metadataLevel, streaming, charset);
        }
Esempio n. 7
0
        protected OeRequestHeaders(String mimeType, OeMetadataLevel metadataLevel, bool streaming, String charset)
        {
            MimeType      = mimeType;
            MetadataLevel = metadataLevel;
            Streaming     = streaming;
            Charset       = charset;

            ContentType = GetContentType(mimeType, metadataLevel, streaming, charset);
        }
 public OeCacheContext(OeQueryContext queryContext)
 {
     _odataUri  = queryContext.ODataUri;
     _entitySet = queryContext.EntitySet;
     _parseNavigationSegments = queryContext.ParseNavigationSegments;
     _metadataLevel           = queryContext.MetadataLevel;
     _navigationNextLink      = queryContext.NavigationNextLink;
     _skipTokenParser         = queryContext.SkipTokenParser;
 }
 public SelectItemTranslator(OeQueryNodeVisitor visitor, ODataPath path, OeMetadataLevel metadataLevel, bool navigationNextLink,
                             ParameterExpression parameter, Expression source)
 {
     _visitor            = visitor;
     _path               = path;
     _metadataLevel      = metadataLevel;
     _navigationNextLink = navigationNextLink;
     _parameter          = parameter;
     _source             = source;
     _model              = visitor.EdmModel;
 }
Esempio n. 10
0
        public Expression Build(Expression source, SelectExpandClause selectClause, OeMetadataLevel metadatLevel)
        {
            _pathSelect = false;
            _selectItemInfos.Clear();
            if (selectClause == null)
            {
                return(source);
            }

            return((MethodCallExpression)CreateExpression(source, selectClause, metadatLevel));
        }
Esempio n. 11
0
        private static String GetContentType(String mimeType, OeMetadataLevel metadataLevel, bool streaming, String charset)
        {
            var metadataArg = metadataLevel switch
            {
                OeMetadataLevel.None => "none",
                OeMetadataLevel.Full => "full",
                _ => "minimal",
            };
            String streamingArg = streaming ? "true" : "false";

            return($"{mimeType};odata.metadata={metadataArg};odata.streaming={streamingArg};charset={charset}");
        }
Esempio n. 12
0
        public void BuildSelect(SelectExpandClause selectClause, OeMetadataLevel metadataLevel)
        {
            if (selectClause != null)
            {
                var selectItemTranslator = new OeSelectItemTranslator(_edmModel, false);
                foreach (SelectItem selectItemClause in selectClause.SelectedItems)
                {
                    selectItemTranslator.Translate(_rootNavigationItem, selectItemClause);
                }
            }

            _rootNavigationItem.AddKeyRecursive(metadataLevel != OeMetadataLevel.Full);
        }
Esempio n. 13
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel, Type returnClrType)
        {
            String        entitySetName = _dataAdapter.EntitySetMetaAdapters.FindByClrType(returnClrType).EntitySetName;
            IEdmEntitySet entitySet     = _model.FindDeclaredEntitySet(entitySetName);

            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(returnClrType, entitySet);

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.GetEntitySetAdapter(entitySet.Name);
            return(new OeQueryContext(_model, odataUri, entitySet, null, false, 0, false,
                                      _dataAdapter.IsDatabaseNullHighestValue, metadataLevel, ref entitySetAdapter)
            {
                EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors),
            });
        }
Esempio n. 14
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());
            if (entitySet == null)
                return null;

            Type clrType = _edmModel.GetClrType(entitySet.EntityType());
            OePropertyAccessor[] accessors = OePropertyAccessor.CreateFromType(clrType, entitySet);

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return new OeQueryContext(_edmModel, odataUri, null, false, 0, false, metadataLevel, entitySetAdapter)
            {
                EntryFactory = OeEntryFactory.CreateEntryFactory(entitySet, accessors),
            };
        }
Esempio n. 15
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, OeMetadataLevel metadataLevel)
        {
            var           importSegment = (OperationImportSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet     = OeOperationHelper.GetEntitySet(importSegment.OperationImports.Single());

            if (entitySet == null)
            {
                return(null);
            }

            OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
            return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
            {
                EntryFactory = new OeEntryFactory(entitySet, accessors, Array.Empty <OePropertyAccessor>()),
                MetadataLevel = metadataLevel
            });
        }
        internal OeQueryContext(IEdmModel edmModel, ODataUri odataUri,
                                IEdmEntitySet entitySet, IReadOnlyList <OeParseNavigationSegment> parseNavigationSegments,
                                bool isCountSegment, int pageSize, bool navigationNextLink, bool isDatabaseNullHighestValue,
                                OeMetadataLevel metadataLevel, ref Db.OeEntitySetAdapter entitySetAdapter)
        {
            EntitySetAdapter        = entitySetAdapter;
            EdmModel                = edmModel;
            ODataUri                = odataUri;
            EntitySet               = entitySet;
            ParseNavigationSegments = parseNavigationSegments;
            IsCountSegment          = isCountSegment;
            PageSize                = pageSize;
            NavigationNextLink      = navigationNextLink;
            MetadataLevel           = metadataLevel;

            if (pageSize > 0 || (odataUri.OrderBy != null && odataUri.Skip != null && odataUri.Top != null))
            {
                IEdmEntityType edmEntityType = OeGetParser.GetEntityType(odataUri.Path, parseNavigationSegments);
                SkipTokenParser = new OeSkipTokenParser(edmModel, edmEntityType, isDatabaseNullHighestValue, odataUri.OrderBy);
            }
        }
Esempio n. 17
0
        private static String GetContentType(String mimeType, OeMetadataLevel metadataLevel, bool streaming, String charset)
        {
            String metadataArg;

            switch (metadataLevel)
            {
            case OeMetadataLevel.None:
                metadataArg = "none";
                break;

            case OeMetadataLevel.Full:
                metadataArg = "full";
                break;

            default:
                metadataArg = "minimal";
                break;
            }

            String streamingArg = streaming ? "true" : "false";

            return($"{mimeType};odata.metadata={metadataArg};odata.streaming={streamingArg};charset={charset}");
        }
Esempio n. 18
0
        public Expression ApplySelect(Expression source, SelectExpandClause selectClause, ODataPath path, OeMetadataLevel metadatLevel)
        {
            if (selectClause == null)
            {
                return(source);
            }

            var        selectTranslator = new OeSelectTranslator(_visitor, path);
            Expression selectExpression = selectTranslator.Build(source, selectClause, metadatLevel);

            _entryFactory = selectTranslator.CreateEntryFactory;

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

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

            return(selectExpression);
        }
Esempio n. 19
0
 public OeQueryContext CreateQueryContext(ODataUri odataUri, IEdmEntitySet entitySet, OeMetadataLevel metadataLevel)
 {
     OePropertyAccessor[]  accessors        = OePropertyAccessor.CreateFromType(_edmModel.GetClrType(entitySet), entitySet);
     Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.Find(entitySet);
     return(new OeQueryContext(_edmModel, odataUri, entitySetAdapter)
     {
         EntryFactory = new OeEntryFactory(entitySet, accessors, null),
         MetadataLevel = metadataLevel
     });
 }
Esempio n. 20
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, int pageSize, bool navigationNextLink, OeMetadataLevel metadataLevel)
        {
            IReadOnlyList <OeParseNavigationSegment> navigationSegments = OeParseNavigationSegment.GetNavigationSegments(odataUri.Path);
            var entitySetSegment = (EntitySetSegment)odataUri.Path.FirstSegment;

            if (pageSize > 0)
            {
                odataUri.Top = pageSize;
                IEdmEntitySet resultEntitySet = OeParseNavigationSegment.GetEntitySet(navigationSegments) ?? entitySetSegment.EntitySet;
                odataUri.OrderBy = OeSkipTokenParser.GetUniqueOrderBy(_edmModel, resultEntitySet, odataUri.OrderBy, odataUri.Apply);
            }

            Db.OeEntitySetAdapter entitySetAdapter = _edmModel.GetEntitySetAdapter(entitySetSegment.EntitySet);
            bool isCountSegment = odataUri.Path.LastSegment is CountSegment;

            return(new OeQueryContext(_edmModel, odataUri, navigationSegments, isCountSegment, pageSize, navigationNextLink, metadataLevel, entitySetAdapter));
        }
Esempio n. 21
0
        public OeQueryContext CreateQueryContext(ODataUri odataUri, int pageSize, bool navigationNextLink, OeMetadataLevel metadataLevel)
        {
            List <OeParseNavigationSegment> navigationSegments = null;

            if (odataUri.Path.LastSegment is KeySegment ||
                odataUri.Path.LastSegment is NavigationPropertySegment)
            {
                navigationSegments = new List <OeParseNavigationSegment>();
                ODataPathSegment previousSegment = null;
                foreach (ODataPathSegment segment in odataUri.Path)
                {
                    if (segment is NavigationPropertySegment navigationSegment)
                    {
                        navigationSegments.Add(new OeParseNavigationSegment(navigationSegment, null));
                    }
                    else if (segment is KeySegment)
                    {
                        IEdmEntitySet previousEntitySet;
                        var           keySegment = segment as KeySegment;
                        navigationSegment = null;
                        if (previousSegment is EntitySetSegment)
                        {
                            var previousEntitySetSegment = previousSegment as EntitySetSegment;
                            previousEntitySet = previousEntitySetSegment.EntitySet;
                        }
                        else if (previousSegment is NavigationPropertySegment)
                        {
                            navigationSegment = previousSegment as NavigationPropertySegment;
                            previousEntitySet = (IEdmEntitySet)navigationSegment.NavigationSource;
                        }
                        else
                        {
                            throw new InvalidOperationException("invalid segment");
                        }

                        FilterClause keyFilter = CreateFilterClause(previousEntitySet, keySegment.Keys);
                        navigationSegments.Add(new OeParseNavigationSegment(navigationSegment, keyFilter));
                    }
                    previousSegment = segment;
                }
            }

            if (pageSize > 0)
            {
                odataUri.Top = pageSize;
                IEdmEntityType edmEntityType = GetEntityType(odataUri.Path, navigationSegments);
                odataUri.OrderBy = OeSkipTokenParser.GetUniqueOrderBy(_edmModel, edmEntityType, odataUri.OrderBy, odataUri.Apply);
            }

            var           entitySetSegment = (EntitySetSegment)odataUri.Path.FirstSegment;
            IEdmEntitySet entitySet        = entitySetSegment.EntitySet;

            Db.OeEntitySetAdapter entitySetAdapter = _dataAdapter.EntitySetAdapters.FindByEntitySetName(entitySet.Name);
            bool isCountSegment = odataUri.Path.LastSegment is CountSegment;

            return(new OeQueryContext(_edmModel, odataUri, entitySet, navigationSegments,
                                      isCountSegment, pageSize, navigationNextLink, _dataAdapter.IsDatabaseNullHighestValue, metadataLevel, entitySetAdapter));
        }
Esempio n. 22
0
 public GetWriter(Uri baseUri, OeMetadataLevel metadataLevel, ODataWriter writer)
 {
     BaseUri       = baseUri;
     MetadataLevel = metadataLevel;
     Writer        = writer;
 }
Esempio n. 23
0
        private Expression CreateExpression(Expression source, SelectExpandClause selectClause, OeMetadataLevel metadatLevel)
        {
            Type itemType = OeExpressionHelper.GetCollectionItemType(source.Type);

            if (itemType == null)
            {
                _parameter = Expression.Parameter(source.Type);
            }
            else
            {
                _parameter = Expression.Parameter(itemType);
            }

            var expressions = new List <Expression>();

            foreach (SelectItem selectItem in selectClause.SelectedItems)
            {
                Expression expression = selectItem.TranslateWith(this);
                if (SelectItemInfoExists(_selectItemInfo.EdmProperty))
                {
                    continue;
                }

                expressions.Add(expression);
                _selectItemInfos.Add(_selectItemInfo);
            }

            if (_pathSelect)
            {
                if (metadatLevel == OeMetadataLevel.Full)
                {
                    AddKey(itemType, expressions);
                }
            }
            else
            {
                expressions.Insert(0, _parameter);
            }

            NewExpression newExpression = OeExpressionHelper.CreateTupleExpression(expressions);

            if (itemType == null)
            {
                return(newExpression);
            }

            LambdaExpression lambda           = Expression.Lambda(newExpression, _parameter);
            MethodInfo       selectMethodInfo = OeMethodInfoHelper.GetSelectMethodInfo(_parameter.Type, newExpression.Type);

            return(Expression.Call(selectMethodInfo, source, lambda));
        }
Esempio n. 24
0
        private static ClrPropertiesInfo GetClrPropertiesInfo(IEdmModel edmModel, SelectExpandClause selectAndExpand,
                                                              OeMetadataLevel metadataLevel, Type clrType, PropertyInfo parentPropertyInfo)
        {
            IEnumerable <IEdmStructuralProperty> edmStructuralProperties;

            ClrPropertiesInfo[] clrPropertiesInfos = Array.Empty <ClrPropertiesInfo>();

            var edmEntityType = (IEdmEntityType)edmModel.FindDeclaredType(clrType.FullName);

            if (selectAndExpand == null)
            {
                edmStructuralProperties = edmEntityType.StructuralProperties();
            }
            else
            {
                var structuralPropertyList = new List <IEdmStructuralProperty>();
                var clrPropertiesInfoList  = new List <ClrPropertiesInfo>();

                foreach (SelectItem selectItem in selectAndExpand.SelectedItems)
                {
                    if (selectItem is ExpandedNavigationSelectItem expandedNavigationSelectItem)
                    {
                        if (expandedNavigationSelectItem.PathToNavigationProperty.Count > 1)
                        {
                            throw new InvalidOperationException("Complex navigation property not supported");
                        }

                        var navigationSegment = (NavigationPropertySegment)expandedNavigationSelectItem.PathToNavigationProperty.FirstSegment;
                        AddNavigationProperty(navigationSegment, expandedNavigationSelectItem.SelectAndExpand, clrPropertiesInfoList);
                    }
                    else if (selectItem is PathSelectItem pathSelectItem)
                    {
                        if (pathSelectItem.SelectedPath.Count > 1)
                        {
                            throw new InvalidOperationException("Complex structural property not supported");
                        }

                        if (pathSelectItem.SelectedPath.FirstSegment is NavigationPropertySegment navigationSegment)
                        {
                            AddNavigationProperty(navigationSegment, null, clrPropertiesInfoList);
                        }
                        else
                        {
                            var propertySegment = (PropertySegment)pathSelectItem.SelectedPath.FirstSegment;
                            structuralPropertyList.Add(propertySegment.Property);
                        }
                    }
                }

                if (metadataLevel == OeMetadataLevel.Full)
                {
                    foreach (IEdmStructuralProperty keyProperty in edmEntityType.Key())
                    {
                        if (!structuralPropertyList.Contains(keyProperty))
                        {
                            structuralPropertyList.Add(keyProperty);
                        }
                    }
                }

                if (selectAndExpand.AllSelected)
                {
                    edmStructuralProperties = edmEntityType.StructuralProperties();
                }
                else
                {
                    edmStructuralProperties = structuralPropertyList.ToArray();
                }
                clrPropertiesInfos = clrPropertiesInfoList.Count == 0 ? Array.Empty <ClrPropertiesInfo>() : clrPropertiesInfoList.ToArray();
            }

            var clrStructuralProperties = new List <PropertyInfo>();

            foreach (IEdmProperty edmProperty in edmStructuralProperties)
            {
                clrStructuralProperties.Add(clrType.GetProperty(edmProperty.Name));
            }

            return(new ClrPropertiesInfo(parentPropertyInfo, clrStructuralProperties.ToArray(), clrPropertiesInfos));

            void AddNavigationProperty(NavigationPropertySegment navigationSegment, SelectExpandClause selectExpandClause, List <ClrPropertiesInfo> clrPropertiesInfoList)
            {
                PropertyInfo navigationPropertyInfo = clrType.GetPropertyIgnoreCase(navigationSegment.NavigationProperty);
                Type         itemType = OeExpressionHelper.GetCollectionItemType(navigationPropertyInfo.PropertyType);

                if (itemType == null)
                {
                    itemType = navigationPropertyInfo.PropertyType;
                }

                foreach (ClrPropertiesInfo clrPropertiesInfo in clrPropertiesInfoList)
                {
                    if (clrPropertiesInfo.ParentPropertyInfo == navigationPropertyInfo)
                    {
                        return;
                    }
                }

                clrPropertiesInfoList.Add(GetClrPropertiesInfo(edmModel, selectExpandClause, metadataLevel, itemType, navigationPropertyInfo));
            }
        }
Esempio n. 25
0
 public OeSelectTranslator(OeJoinBuilder joinBuilder, ODataPath path, OeMetadataLevel metadataLevel) :
     this(joinBuilder, new OeSelectItem(path))
 {
     _metadataLevel = metadataLevel;
 }