Example #1
0
        //private static readonly LoggerFactory MyLoggerFactory = new LoggerFactory(new[] {new ConsoleLoggerProvider((category, level)
        //    => true, true) });

        public static EdmModel BuildEdmModel(Db.OeDataAdapter dataAdapter, ModelBuilder.OeEdmModelMetadataProvider metadataProvider)
        {
            var order2DataAdapter = new Order2DataAdapter(false, true, "test2");
            var refModel          = new ModelBuilder.OeEdmModelBuilder(dataAdapter, metadataProvider).BuildEdmModel();

            return(order2DataAdapter.BuildEdmModel(refModel));
        }
Example #2
0
            protected override Expression VisitMethodCall(MethodCallExpression node)
            {
                if (node.Arguments.Count > 0 && node.Arguments[0] is MemberExpression navigationPropertyExpression)
                {
                    Type?innerItemType = OeExpressionHelper.GetCollectionItemTypeOrNull(navigationPropertyExpression.Type);
                    if (innerItemType != null)
                    {
                        IEdmModel        edmModel    = _edmModel.GetEdmModel(innerItemType) ?? throw new InvalidOperationException("Cannot find IEdmModel for type " + innerItemType.FullName);
                        Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(edmModel.EntityContainer);

                        Db.OeEntitySetAdapter?innerEntitySetAdapter = dataAdapter.EntitySetAdapters.Find(innerItemType);
                        if (innerEntitySetAdapter == null)
                        {
                            throw new InvalidOperationException("OeEntitySetAdapter not found for type " + innerItemType.Name);
                        }
                        IEdmEntitySet      entitySet   = edmModel.FindDeclaredEntitySet(innerEntitySetAdapter.EntitySetName);
                        ConstantExpression innerSource = OeEnumerableStub.CreateEnumerableStubExpression(innerEntitySetAdapter.EntityType, entitySet);

                        IEdmNavigationProperty navigationProperty = GetEdmNavigationProperty(dataAdapter, navigationPropertyExpression);
                        Expression[]           arguments          = node.Arguments.ToArray();
                        arguments[0] = GetJoin(innerSource, navigationProperty);
                        return(node.Update(node.Object !, arguments));
                    }
                }

                return(base.VisitMethodCall(node));
            }
Example #3
0
        public async Task BoundFunctionSingle()
        {
            int        orderId;
            List <int> expectedResult;

            using (var dbContext = Fixture.CreateContext())
            {
                orderId        = dbContext.Orders.Single(i => i.Name == "Order 1").Id;
                expectedResult = dbContext.OrderItems.Where(i => i.OrderId == orderId).Select(i => i.Id).ToList();
            }

            Db.OeDataAdapter dataAdapter = Fixture.EdmModel.GetDataAdapter(Fixture.EdmModel.EntityContainer);
            String           request     = $"Orders({orderId})/{dataAdapter.DataContextType.Namespace}.BoundFunctionSingle(customerNames=['Natasha','Ivan','Sasha'])";

            ODataUri  odataUri = Fixture.ParseUri(request);
            IEdmModel edmModel = Fixture.EdmModel.GetEdmModel(odataUri.Path);
            var       parser   = new OeParser(odataUri.ServiceRoot, edmModel);
            var       uri      = new Uri(odataUri.ServiceRoot, request);

            var response = new MemoryStream();
            await parser.ExecuteQueryAsync(odataUri, OeRequestHeaders.JsonDefault, response, CancellationToken.None).ConfigureAwait(false);

            response.Position = 0;

            List <Object> fromOe = new ResponseReader(edmModel).Read(response).Cast <Object>().ToList();

            Assert.Equal(expectedResult, fromOe.Select(i => (int)((dynamic)i).Id).OrderBy(id => id));
        }
Example #4
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvcCore();

            _dataAdapter = new OrderOeDataAdapter(true, true, null);
            services.AddSingleton(typeof(Db.OeDataAdapter), _dataAdapter);
        }
        private MethodCallExpression?GetJoin(Expression outer, MemberExpression navigationProperty)
        {
            Type outerType = outer.Type;
            Type innerType = navigationProperty.Type;

            IEdmModel?edmModel = _edmModel.GetEdmModel(outerType);

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

            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(edmModel.EntityContainer);

            Db.OeEntitySetAdapter?outerEntitySetAdapter = dataAdapter.EntitySetAdapters.Find(outerType);
            if (outerEntitySetAdapter == null)
            {
                throw new InvalidOperationException("OeEntitySetAdapter not found for type " + outerType.Name);
            }

            IEdmEntitySet          outerEntitySet        = OeEdmClrHelper.GetEntitySet(_edmModel, outerEntitySetAdapter.EntitySetName);
            IEdmNavigationProperty edmNavigationProperty = outerEntitySet.EntityType().NavigationProperties().Single(p => p.Name == navigationProperty.Member.Name);

            Db.OeEntitySetAdapter?innerEntitySetAdapter = dataAdapter.EntitySetAdapters.Find(innerType);
            if (innerEntitySetAdapter == null)
            {
                throw new InvalidOperationException("OeEntitySetAdapter not found for type " + innerType.Name);
            }

            IEdmEntitySet      entitySet   = edmModel.FindDeclaredEntitySet(innerEntitySetAdapter.EntitySetName);
            ConstantExpression innerSource = OeEnumerableStub.CreateEnumerableStubExpression(innerType, entitySet);

            return(GetJoin(outer, innerSource, edmNavigationProperty));
        }
        private IAsyncEnumerable <Object> GetAsyncEnumerator(IQueryable source = null)
        {
            _httpContext.Response.RegisterForDispose(this);

            ODataUri  odataUri = OeParser.ParseUri(_edmModel, UriHelper.GetBaseUri(_httpContext.Request), UriHelper.GetUri(_httpContext.Request));
            IEdmModel refModel = _edmModel.GetEdmModel(odataUri.Path);

            _dataAdapter = refModel.GetDataAdapter(refModel.EntityContainer);
            if (_dataContext == null)
            {
                _dataContext = _dataAdapter.CreateDataContext();
            }

            var requestHeaders       = (HttpRequestHeaders)_httpContext.Request.Headers;
            OeRequestHeaders headers = GetRequestHeaders(requestHeaders, _httpContext.Response);

            if (odataUri.Path.LastSegment is OperationImportSegment)
            {
                return(ExecutePost(refModel, odataUri, headers, _httpContext.Request.Body));
            }
            else
            {
                return(ExecuteGet(refModel, odataUri, headers, source));
            }
        }
Example #7
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvcCore();

            _dataAdapter = new OrderOeDataAdapter(Test.Model.OrderContext.GenerateDatabaseName());
            services.AddSingleton(typeof(Db.OeDataAdapter), _dataAdapter);
        }
        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 queryContext = new Parsers.OeQueryContext(refModel, odataUri);
                IAsyncEnumerator <Object> asyncEnumerator = dataAdapter.Execute(context.UserContext, queryContext).GetEnumerator();
                using (var entityAsyncEnumerator = new OeGraphqlAsyncEnumerator(asyncEnumerator, queryContext.EntryFactory))
                {
                    while (entityAsyncEnumerator.MoveNext().GetAwaiter().GetResult())
                    {
                        results.Add(entityAsyncEnumerator.Current);
                    }
                }
            }
            finally
            {
                if (context.UserContext != null)
                {
                    dataAdapter.CloseDataContext(context.UserContext);
                }
            }

            return(results);
        }
Example #9
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);
                }
            }
        }
        public override Object CreateDataContext()
        {
            var dataContext = Infrastructure.FastActivator.CreateInstance <T>();

            dataContext.DataContext = new OeLinq2DbDataContext(GetEdmModel(_edmModel), _entitySetAdapters);
            return(dataContext);

            IEdmModel GetEdmModel(IEdmModel edmModel)
            {
                Db.OeDataAdapter dataAdapter = edmModel.GetAnnotationValue <Db.OeDataAdapter>(edmModel.EntityContainer);
                if (dataAdapter.DataContextType == typeof(T))
                {
                    return(edmModel);
                }

                foreach (IEdmModel refModel in edmModel.ReferencedModels)
                {
                    if (refModel.EntityContainer != null && refModel is EdmModel)
                    {
                        return(GetEdmModel(edmModel));
                    }
                }

                throw new InvalidOperationException("EdmModel not found for data context type " + typeof(T).FullName);
            }
        }
Example #11
0
        public async Task BoundFunctionSingle()
        {
            List <int> expectedResult;

            using (var dbContext = Fixture.CreateContext())
                expectedResult = dbContext.OrderItems.Where(i =>
                                                            (i.Order.Name == "Order 1" || i.Order.Name == "Order 2") && i.Order.Customer.Country == "RU" && i.Order.Customer.Id == 1)
                                 .Select(i => i.Id).ToList();

            Db.OeDataAdapter dataAdapter = Fixture.OeEdmModel.GetDataAdapter(Fixture.OeEdmModel.EntityContainer);
            String           request     = $"Customers('RU',1)/{dataAdapter.DataContextType.Namespace}.BoundFunctionSingle(orderNames=['Order 1','Order 2'])?$expand=Customer,Items&$select=Name";

            ODataUri  odataUri = Fixture.ParseUri(request);
            IEdmModel edmModel = Fixture.OeEdmModel.GetEdmModel(odataUri.Path);
            var       parser   = new OeParser(odataUri.ServiceRoot, edmModel);

            var response = new MemoryStream();
            await parser.ExecuteQueryAsync(odataUri, OeRequestHeaders.JsonDefault, response, CancellationToken.None).ConfigureAwait(false);

            response.Position = 0;

            List <Object> fromOe = new ResponseReader(edmModel).Read(response).Cast <Object>().ToList();

            Assert.Equal(expectedResult, fromOe.SelectMany(c => (IEnumerable <dynamic>)((dynamic)c).Items).Select(i => (int)i.Id).OrderBy(id => id));
        }
        public static EdmModel BuildEdmModel(Db.OeDataAdapter dataAdapter, ModelBuilder.OeEdmModelMetadataProvider metadataProvider)
        {
            bool allowCache        = TestHelper.GetQueryCache(dataAdapter).AllowCache;
            var  order2DataAdapter = new Order2DataAdapter(allowCache, true, "test2");
            var  refModel          = new ModelBuilder.OeEdmModelBuilder(dataAdapter, metadataProvider).BuildEdmModel();

            return(order2DataAdapter.BuildEdmModel(refModel));
        }
        public ResponseReader(IEdmModel edmModel, Db.OeDataAdapter dataAdapter)
        {
            EdmModel     = edmModel;
            _dataAdapter = dataAdapter;

            NavigationProperties       = new Dictionary <IEnumerable, ODataResourceSetBase>();
            NavigationPropertyEntities = new Dictionary <Object, Dictionary <PropertyInfo, ODataResourceSetBase> >();
        }
Example #14
0
 public static EdmModel BuildEdmModelFromEf6Model(this Db.OeDataAdapter dataAdapter)
 {
     using (var context = (DbContext)dataAdapter.CreateDataContext())
     {
         var modelBuilder = new OeEdmModelBuilder(dataAdapter, new OeEf6EdmModelMetadataProvider(context));
         return(modelBuilder.BuildEdmModel());
     }
 }
Example #15
0
        protected DbFixture(Db.OeDataAdapter dataAdapter1, Db.OeDataAdapter dataAdapter2)
        {
            EdmModel refModel = dataAdapter2.BuildEdmModelFromEfCoreModel();

            EdmModel = dataAdapter1.BuildEdmModelFromEfCoreModel(refModel);

            Schema         = new OeSchemaBuilder(EdmModel).Build();
            _graphqlParser = new OeGraphqlParser(EdmModel);
        }
        public OeEdmModelBuilder(Db.OeDataAdapter dataAdapter, OeEdmModelMetadataProvider metadataProvider)
        {
            _dataAdapter      = dataAdapter;
            _metadataProvider = metadataProvider;

            _complexTypes            = new Dictionary <Type, EdmComplexType>();
            _enumTypes               = new Dictionary <Type, EdmEnumType>();
            _operationConfigurations = new List <OeOperationConfiguration>();
        }
Example #17
0
        private static async Task InitializeAsync(Db.OeDataAdapter dataAdapter, IEdmModel edmModel)
        {
            var    parser   = new OeParser(new Uri("http://dummy/"), dataAdapter, edmModel);
            String fileName = Directory.EnumerateFiles(".", "Add.batch", SearchOption.AllDirectories).First();

            byte[] bytes          = File.ReadAllBytes(fileName);
            var    responseStream = new MemoryStream();

            await parser.ExecuteBatchAsync(new MemoryStream(bytes), responseStream, CancellationToken.None).ConfigureAwait(false);
        }
Example #18
0
 public static EdmModel BuildEdmModelFromEf6Model(this Db.OeDataAdapter dataAdapter)
 {
     using (var context = (DbContext)dataAdapter.CreateDataContext())
     {
         var metadataProvider = new OeEf6EdmModelMetadataProvider(context);
         var modelBuilder     = new OeEdmModelBuilder(metadataProvider);
         modelBuilder.AddEntitySetRange(dataAdapter.EntitySetMetaAdapters.GetEntitySetNamesEntityTypes());
         OeDataAdapterExtension.BuildOperations(dataAdapter, modelBuilder);
         return(modelBuilder.BuildEdmModel());
     }
 }
Example #19
0
            private IEdmNavigationProperty GetEdmNavigationProperty(Db.OeDataAdapter dataAdapter, MemberExpression navigationProperty)
            {
                Type outerItemType = OeExpressionHelper.GetCollectionItemType(_outerSource.Type);

                Db.OeEntitySetAdapter?outerEntitySetAdapter = dataAdapter.EntitySetAdapters.Find(outerItemType);
                if (outerEntitySetAdapter == null)
                {
                    throw new InvalidOperationException("OeEntitySetAdapter not found for type " + outerItemType.Name);
                }
                IEdmEntitySet outerEntitySet = OeEdmClrHelper.GetEntitySet(_edmModel, outerEntitySetAdapter.EntitySetName);

                return(outerEntitySet.EntityType().NavigationProperties().Single(p => p.Name == navigationProperty.Member.Name));
            }
Example #20
0
        public static IList ExecuteDb <T, TResult>(Db.OeDataAdapter dataAdapter, DbContext dataContext,
                                                   Expression <Func <IQueryable <T>, IQueryable <TResult> > > expression, out IReadOnlyList <EfInclude> includes)
        {
            var        visitor = new QueryVisitor <T>(dataAdapter.EntitySetAdapters, dataContext);
            Expression call    = visitor.Visit(expression.Body);

            var metadataProvider = new OdataToEntity.EfCore.OeEfCoreEdmModelMetadataProvider(dataContext.Model);
            var includeVisitor   = new IncludeVisitor(metadataProvider, dataAdapter.IsDatabaseNullHighestValue);

            call     = includeVisitor.Visit(call);
            includes = includeVisitor.Includes;

            return(visitor.Query.Provider.CreateQuery <TResult>(call).ToList());
        }
Example #21
0
        public static bool GetUseRelationalNulls(Db.OeDataAdapter dataAdapter)
        {
            var serviceProvider = (IInfrastructure <IServiceProvider>)dataAdapter.CreateDataContext();

            try
            {
                RelationalOptionsExtension options = serviceProvider.GetService <IDbContextOptions>().Extensions.OfType <RelationalOptionsExtension>().Single();
                return(options.UseRelationalNulls);
            }
            finally
            {
                dataAdapter.CloseDataContext(serviceProvider);
            }
        }
        public TDataContext GetDbContext <TDataContext>() where TDataContext : class
        {
            if (_dataContext == null)
            {
                Db.OeDataAdapter dataAdapter = _edmModel.GetDataAdapter(typeof(TDataContext));
                if (dataAdapter == null)
                {
                    return(null);
                }

                _dataContext = dataAdapter.CreateDataContext();
            }
            return((TDataContext)_dataContext);
        }
Example #23
0
        public static EdmModel BuildEdmModelFromEfCoreModel(this Db.OeDataAdapter dataAdapter, Type[] excludeTypes, params IEdmModel[] refModels)
        {
            var context = (DbContext)dataAdapter.CreateDataContext();

            try
            {
                var modelBuilder = new OeEdmModelBuilder(dataAdapter, new OeEfCoreEdmModelMetadataProvider(context.Model));
                return(modelBuilder.BuildEdmModel(excludeTypes, refModels));
            }
            finally
            {
                dataAdapter.CloseDataContext(context);
            }
        }
Example #24
0
        public override OrderContext CreateContext()
        {
            Db.OeDataAdapter dataAdapter = OeEdmModel.GetDataAdapter(OeEdmModel.EntityContainer);
            var dbContext = (DbContext)dataAdapter.CreateDataContext();

            try
            {
                DbContextOptions options = TestHelper.CreateOptions <OrderContext>(dbContext);
                return(new OrderContext(options));
            }
            finally
            {
                dataAdapter.CloseDataContext(dbContext);
            }
        }
Example #25
0
        public ODataResult <Model.OrderItem> WithItems(String itemIds)
        {
            List <int> ids = JArray.Parse(itemIds).Select(j => j.Value <int>()).ToList();

            var edmModel = (IEdmModel)_httpContextAccessor.HttpContext.RequestServices.GetService(typeof(IEdmModel));

            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(typeof(Model.OrderContext));
            var orderContext             = (Model.OrderContext)dataAdapter.CreateDataContext();

            List <Model.OrderItem> orderItems = orderContext.OrderItems.Where(i => ids.Contains(i.Id)).ToList();

            dataAdapter.CloseDataContext(orderContext);

            return(_httpContextAccessor.HttpContext.OData(orderItems));
        }
Example #26
0
        public static IEnumerable <OrderItem> BoundFunctionSingle(IEdmModel edmModel, Order order, IEnumerable <String> customerNames)
        {
            var customerNameSet = new HashSet <String>(customerNames);

            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(typeof(OrderEf6Context));
            var      orderContext        = (OrderEf6Context)dataAdapter.CreateDataContext();
            Customer customer            = orderContext.Customers.Find(new Object[] { order.CustomerCountry, order.CustomerId });

            if (customerNameSet.Contains(customer.Name))
            {
                foreach (OrderItem orderItem in orderContext.OrderItems.Where(i => i.OrderId == order.Id))
                {
                    yield return(orderItem);
                }
            }
        }
Example #27
0
        protected static void EnsureCreated(IEdmModel edmModel)
        {
            Db.OeDataAdapter dataAdapter = edmModel.GetDataAdapter(edmModel.EntityContainer);
            var dbContext = (DbContext)dataAdapter.CreateDataContext();

            dbContext.Database.EnsureCreated();
            dataAdapter.CloseDataContext(dbContext);

            foreach (IEdmModel refModel in edmModel.ReferencedModels)
            {
                if (refModel.EntityContainer != null)
                {
                    EnsureCreated(refModel);
                }
            }
        }
Example #28
0
        public static EdmModel BuildEdmModelFromEfCorePgSqlModel(this Db.OeDataAdapter dataAdapter, String schema, params IEdmModel[] refModels)
        {
            var context = (DbContext)dataAdapter.CreateDataContext();

            try
            {
                var model = (Model)context.Model;
                model.Relational().DefaultSchema = schema;
                var modelBuilder = new OeEdmModelBuilder(dataAdapter, new OeEfCoreEdmModelMetadataProvider(model));
                return(modelBuilder.BuildEdmModel(refModels));
            }
            finally
            {
                dataAdapter.CloseDataContext(context);
            }
        }
Example #29
0
        private static Db.OeEntitySetAdapter GetEntitySetAdapter(IEdmModel edmModel, Type entityType)
        {
            Db.OeDataAdapter      dataAdapter      = edmModel.GetDataAdapter(edmModel.EntityContainer);
            Db.OeEntitySetAdapter entitySetAdapter = dataAdapter.EntitySetAdapters.Find(entityType);
            if (entitySetAdapter != null)
            {
                return(entitySetAdapter);
            }

            foreach (IEdmModel refModel in edmModel.ReferencedModels)
            {
                return(GetEntitySetAdapter(refModel, entityType));
            }

            throw new InvalidOperationException("Entity type " + entityType.FullName + " not found in edm model");
        }
Example #30
0
        private OeEntryFactory CreateEntryFactory(OeExpressionBuilder expressionBuilder)
        {
            IEdmEntitySet entitySet = EntitySet;

            if (expressionBuilder.EntityType != EntitySetAdapter.EntityType)
            {
                String                    typeName             = expressionBuilder.EntityType.FullName;
                Db.OeDataAdapter          dataAdapter          = EntitySetAdapter.DataAdapter;
                Db.OeEntitySetMetaAdapter entitySetMetaAdapter = dataAdapter.EntitySetMetaAdapters.FindByTypeName(typeName);
                if (entitySetMetaAdapter != null)
                {
                    entitySet = EdmModel.FindDeclaredEntitySet(entitySetMetaAdapter.EntitySetName);
                }
            }
            return(expressionBuilder.CreateEntryFactory(entitySet));
        }