예제 #1
0
        public OeEntityAsyncEnumerator(OeEntryFactory entryFactory, Db.OeAsyncEnumerator asyncEnumerator)
        {
            _entryFactory    = entryFactory;
            _asyncEnumerator = asyncEnumerator;

            _isFirstMoveNext = true;
        }
예제 #2
0
 public async Task ExecuteAsync(ODataUri odataUri, Stream requestStream, OeRequestHeaders headers, Stream responseStream, CancellationToken cancellationToken)
 {
     Object dataContext = null;
     try
     {
         dataContext = _dataAdapter.CreateDataContext();
         using (Db.OeAsyncEnumerator asyncEnumerator = GetAsyncEnumerator(odataUri, requestStream, headers, dataContext, out bool isScalar))
         {
             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());
                     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).ConfigureAwait(false);
                 else
                     await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, responseStream).ConfigureAwait(false);
             }
         }
     }
     finally
     {
         if (dataContext != null)
             _dataAdapter.CloseDataContext(dataContext);
     }
 }
예제 #3
0
        public async Task ExecuteAsync(ODataUri odataUri, OeRequestHeaders headers, Stream stream, CancellationToken cancellationToken)
        {
            OeQueryContext queryContext = CreateQueryContext(odataUri, headers.MaxPageSize, headers.NavigationNextLink, headers.MetadataLevel);

            Db.OeDataAdapter dataAdapter = _edmModel.GetDataAdapter(queryContext.EdmModel.EntityContainer);

            Object dataContext = null;

            try
            {
                dataContext = dataAdapter.CreateDataContext();
                if (queryContext.IsCountSegment)
                {
                    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 (Db.OeAsyncEnumerator asyncEnumerator = dataAdapter.ExecuteEnumerator(dataContext, queryContext, cancellationToken))
                        await Writers.OeGetWriter.SerializeAsync(queryContext, asyncEnumerator, headers.ContentType, stream).ConfigureAwait(false);
                }
            }
            finally
            {
                if (dataContext != null)
                {
                    dataAdapter.CloseDataContext(dataContext);
                }
            }
        }
예제 #4
0
        public IEnumerable <Dictionary <String, Object> > Resolve(ResolveFieldContext context)
        {
            var results = new List <Dictionary <String, Object> >();

            var       translator = new OeGraphqlAstToODataUri(_edmModel, context);
            ODataUri  odataUri   = translator.Translate(context.Document.OriginalQuery);
            IEdmModel refModel   = _edmModel.GetEdmModel(odataUri.Path);

            Db.OeDataAdapter dataAdapter = refModel.GetDataAdapter(refModel.EntityContainer);
            context.UserContext = dataAdapter.CreateDataContext();

            try
            {
                var parser = new Parsers.OeGetParser(refModel);
                Parsers.OeQueryContext queryContext    = parser.CreateQueryContext(odataUri, 0, false, OeMetadataLevel.Minimal);
                Db.OeAsyncEnumerator   asyncEnumerator = dataAdapter.ExecuteEnumerator(context.UserContext, queryContext, CancellationToken.None);
                using (var entityAsyncEnumerator = new OeGraphqlAsyncEnumerator(asyncEnumerator, queryContext.EntryFactory, queryContext))
                {
                    while (entityAsyncEnumerator.MoveNext().GetAwaiter().GetResult())
                    {
                        results.Add(entityAsyncEnumerator.Current);
                    }
                }
            }
            finally
            {
                if (context.UserContext != null)
                {
                    dataAdapter.CloseDataContext(context.UserContext);
                }
            }

            return(results);
        }
예제 #5
0
 public OeGraphqlAsyncEnumerator(Db.OeAsyncEnumerator asyncEnumerator, OeEntryFactory entryFactory, OeQueryContext queryContext)
 {
     _dispose         = asyncEnumerator;
     _dbEnumerator    = new Db.OeDbEnumerator(asyncEnumerator, entryFactory);
     _queryContext    = queryContext;
     _isFirstMoveNext = true;
 }
예제 #6
0
            public async Task SerializeAsync(OeEntryFactory entryFactory, Db.OeAsyncEnumerator asyncEnumerator, OeQueryContext queryContext)
            {
                var resourceSet = new ODataResourceSet()
                {
                    Count = asyncEnumerator.Count
                };

                _writer.WriteStart(resourceSet);

                Object buffer       = null;
                int    count        = 0;
                var    dbEnumerator = entryFactory.IsTuple ?
                                      (Db.IOeDbEnumerator) new Db.OeDbEnumerator(asyncEnumerator, entryFactory) : new Db.OeEntityDbEnumerator(asyncEnumerator, entryFactory);

                while (await dbEnumerator.MoveNextAsync().ConfigureAwait(false))
                {
                    Object value = dbEnumerator.Current;
                    await WriteEntry(dbEnumerator, value, _queryContext.NavigationNextLink).ConfigureAwait(false);

                    count++;
                    buffer = dbEnumerator.ClearBuffer();
                }

                if (queryContext.PageSize > 0 && count > 0 && (asyncEnumerator.Count ?? Int32.MaxValue) > count)
                {
                    resourceSet.NextPageLink = BuildNextPageLink(queryContext, buffer);
                }

                _writer.WriteEnd();
            }
예제 #7
0
        public IEnumerable<T> Resolve(ResolveFieldContext context)
        {
            var zzz3 = context.ParentType.Fields.Single(f => f.Name == context.Document.Operations.Single().SelectionSet.Selections.OfType<Field>().Single().Name);
            var zzz = context.Schema.FindType("order");
            var zzz2 = context.Schema.Query.Fields.Single(f => f.Name == context.FieldAst.Name);

            var barcode = context.GetArgument<string>("barcode");
            var title = context.GetArgument<string>("title");
            var sellingPrice = context.GetArgument<decimal>("sellingPrice");

            var results = new List<T>();

            var odataParser = new ODataUriParser(_edmModel, new Uri("http://dummy"), new Uri("http://dummy/Orders?$expand=Customer&$select=Name"));
            odataParser.Resolver.EnableCaseInsensitive = true;
            //ODataUri odataUri = odataParser.ParseUri();

            var translator = new OeGraphQLAstToODataUri(_edmModel, context.Schema);
            ODataUri odataUri = translator.Translate(context.Document.OriginalQuery);
            var odataQuery = odataUri.BuildUri(ODataUrlKeyDelimiter.Parentheses);

            var parser = new OeGetParser(_dataAdapter, _edmModel);
            Parsers.OeQueryContext queryContext = parser.CreateQueryContext(odataUri, 0, false, OeMetadataLevel.Minimal);
            Db.OeAsyncEnumerator asyncEnumerator = _dataAdapter.ExecuteEnumerator(context.UserContext, queryContext, CancellationToken.None);
            using (var entityAsyncEnumerator = new OeEntityAsyncEnumerator<T>(queryContext.EntryFactory, asyncEnumerator, queryContext))
            {
                while (entityAsyncEnumerator.MoveNext().GetAwaiter().GetResult())
                    results.Add((T)entityAsyncEnumerator.Current);
            }
            return results;
        }
예제 #8
0
            public async Task SerializeAsync(OeEntryFactory entryFactory, Db.OeAsyncEnumerator asyncEnumerator, OeQueryContext queryContext)
            {
                var resourceSet = new ODataResourceSet()
                {
                    Count = asyncEnumerator.Count
                };

                Writer.WriteStart(resourceSet);

                Object value = null;
                int    count = 0;

                while (await asyncEnumerator.MoveNextAsync().ConfigureAwait(false))
                {
                    value = asyncEnumerator.Current;
                    ODataResource entry = CreateEntry(entryFactory, entryFactory.GetValue(value, out _));
                    Writer.WriteStart(entry);

                    foreach (OeEntryFactory navigationLink in entryFactory.NavigationLinks)
                    {
                        WriteNavigationLink(value, navigationLink, entry, entryFactory.EntitySet);
                    }

                    if (QueryContext.NavigationNextLink)
                    {
                        foreach (ExpandedNavigationSelectItem item in QueryContext.GetExpandedNavigationSelectItems())
                        {
                            WriteNavigationNextLink(entry, item);
                        }
                    }

                    Writer.WriteEnd();
                    count++;
                }

                if (queryContext.PageSize > 0 && count > 0 && (asyncEnumerator.Count ?? Int32.MaxValue) > count)
                {
                    resourceSet.NextPageLink = BuildNextPageLink(queryContext, value);
                }

                Writer.WriteEnd();
            }
예제 #9
0
        public static async Task SerializeAsync(OeQueryContext queryContext, Db.OeAsyncEnumerator asyncEnumerator, String contentType, Stream stream)
        {
            OeEntryFactory entryFactory = queryContext.EntryFactory;
            var            settings     = new ODataMessageWriterSettings()
            {
                BaseUri = queryContext.ODataUri.ServiceRoot,
                EnableMessageStreamDisposal = false,
                ODataUri    = queryContext.ODataUri,
                Validations = ValidationKinds.ThrowIfTypeConflictsWithMetadata | ValidationKinds.ThrowOnDuplicatePropertyNames,
                Version     = ODataVersion.V4
            };

            IODataResponseMessage responseMessage = new OeInMemoryMessage(stream, contentType);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, settings, queryContext.EdmModel))
            {
                ODataUtils.SetHeadersForPayload(messageWriter, ODataPayloadKind.ResourceSet);
                ODataWriter writer    = messageWriter.CreateODataResourceSetWriter(entryFactory.EntitySet, entryFactory.EntityType);
                var         getWriter = new GetWriter(queryContext, writer);
                await getWriter.SerializeAsync(entryFactory, asyncEnumerator, queryContext).ConfigureAwait(false);
            }
        }
예제 #10
0
        public static async Task WriteCollectionAsync(IEdmModel model, ODataUri odataUri, Db.OeAsyncEnumerator asyncEnumerator, Stream responseStream)
        {
            var importSegment = (OperationImportSegment)odataUri.Path.LastSegment;
            IEdmOperationImport operationImport = importSegment.OperationImports.Single();
            Type returnType = model.GetClrType(operationImport.Operation.ReturnType.Definition);

            IODataRequestMessage requestMessage = new Infrastructure.OeInMemoryMessage(responseStream, null);

            using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage,
                                                                             new ODataMessageWriterSettings()
            {
                EnableMessageStreamDisposal = false, ODataUri = odataUri
            }, model))
            {
                IEdmTypeReference     typeRef = OeEdmClrHelper.GetEdmTypeReference(model, returnType);
                ODataCollectionWriter writer  = messageWriter.CreateODataCollectionWriter(typeRef);
                writer.WriteStart(new ODataCollectionStart());

                while (await asyncEnumerator.MoveNextAsync().ConfigureAwait(false))
                {
                    Object value = asyncEnumerator.Current;
                    if (value != null && value.GetType().IsEnum)
                    {
                        value = value.ToString();
                    }

                    writer.WriteItem(value);
                }

                writer.WriteEnd();
            }
        }
예제 #11
0
 public OePrimitiveAsyncEnumerator(Db.OeAsyncEnumerator asyncEnumerator)
 {
     _asyncEnumerator = asyncEnumerator;
 }
예제 #12
0
 public ODataResult <Model.ManyColumns> Get()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.ManyColumns>(asyncEnumerator));
 }
예제 #13
0
 public ODataResult <Model.Customer> Get(String country, String id)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.Customer>(asyncEnumerator));
 }
예제 #14
0
 public OeEntityAsyncEnumerator(OeEntryFactory entryFactory, Db.OeAsyncEnumerator asyncEnumerator, OeQueryContext queryContext)
     : this(entryFactory, asyncEnumerator)
 {
     _queryContext = queryContext;
 }
예제 #15
0
 public ODataResult <Model.Order> TableFunction()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.Order>(asyncEnumerator));
 }
 public IActionResult TableFunctionWithParameters()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData(asyncEnumerator));
 }
 public async Task <IActionResult> ScalarFunctionWithParameters()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(await base.ODataScalar(asyncEnumerator));
 }
 public async Task <IActionResult> ResetManyColumns()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(await base.ODataScalar(asyncEnumerator));
 }
예제 #19
0
 public ODataResult <Model.OrderItem> GetItems(int id)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.OrderItem>(asyncEnumerator));
 }
 public OeEntityAsyncEnumerator(OeEntryFactory entryFactory, Db.OeAsyncEnumerator asyncEnumerator, OeSkipTokenParser skipTokenParser)
     : this(entryFactory, asyncEnumerator)
 {
     _skipTokenParser = skipTokenParser;
 }
예제 #21
0
 public ODataResult <Model.Customer> OrderCustomer(int id)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.Customer>(asyncEnumerator));
 }
예제 #22
0
 public ODataResult <Model.ShippingAddress> Get(int id)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.ShippingAddress>(asyncEnumerator));
 }
예제 #23
0
 public ODataResult <Model.Order> TableFunctionWithParameters(String id, String name, String status)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.Order>(asyncEnumerator));
 }
 public IActionResult Get()
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData(asyncEnumerator));
 }
예제 #25
0
 public ODataResult <Model.Category> Get(int id)
 {
     Db.OeAsyncEnumerator asyncEnumerator = base.GetAsyncEnumerator(base.HttpContext, base.HttpContext.Response.Body);
     return(base.OData <Model.Category>(asyncEnumerator));
 }