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); } }
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)); } }
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); } }
internal OeSelectTranslator(OeJoinBuilder joinBuilder, OeSelectItem navigationItem) { _joinBuilder = joinBuilder; _navigationItem = navigationItem; _visitor = joinBuilder.Visitor; _metadataLevel = OeMetadataLevel.None; }
private OeRequestHeaders(OeMetadataLevel metadataLevel, bool streaming, String charset) { _metadataLevel = metadataLevel; _streaming = streaming; _charset = charset; _contentType = GetContentType(metadataLevel, streaming, charset); }
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; }
public Expression Build(Expression source, SelectExpandClause selectClause, OeMetadataLevel metadatLevel) { _pathSelect = false; _selectItemInfos.Clear(); if (selectClause == null) { return(source); } return((MethodCallExpression)CreateExpression(source, selectClause, metadatLevel)); }
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}"); }
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); }
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), }); }
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), }; }
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); } }
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}"); }
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); }
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 }); }
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)); }
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)); }
public GetWriter(Uri baseUri, OeMetadataLevel metadataLevel, ODataWriter writer) { BaseUri = baseUri; MetadataLevel = metadataLevel; Writer = writer; }
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)); }
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)); } }
public OeSelectTranslator(OeJoinBuilder joinBuilder, ODataPath path, OeMetadataLevel metadataLevel) : this(joinBuilder, new OeSelectItem(path)) { _metadataLevel = metadataLevel; }