Metadata definition for the DSP. This also implements the IDataServiceMetadataProvider.
Inheritance: IDataServiceMetadataProvider, ICloneable
コード例 #1
0
ファイル: MongoMetadata.cs プロジェクト: scbond/MongOData
        public MongoMetadata(string connectionString, MongoConfiguration.Metadata metadata = null)
        {
            this.connectionString = connectionString;
            this.Configuration = metadata ?? MongoConfiguration.Metadata.Default;
            lock (MetadataCache)
            {
                MongoMetadataCache metadataCache;
                MetadataCache.TryGetValue(this.connectionString, out metadataCache);
                if (metadataCache == null)
                {
                    metadataCache = new MongoMetadataCache
                                        {
                                            DspMetadata = new DSPMetadata(ContainerName, RootNamespace),
                                            ProviderTypes = new Dictionary<string, Type>()
                                        };
                    MetadataCache.Add(this.connectionString, metadataCache);
                }
                this.dspMetadata = metadataCache.DspMetadata;
                this.providerTypes = metadataCache.ProviderTypes;
            }

            using (var context = new MongoContext(connectionString))
            {
                PopulateMetadata(context);
            }
        }
コード例 #2
0
        protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context)
        {
            foreach (var collectionName in GetCollectionNames(context))
            {
                var collection = context.Database.GetCollection(collectionName);
                var document = collection.FindOne();
                if (document != null)
                {
                    var collectionType = metadata.AddEntityType(collectionName);

                    foreach (var element in document.Elements)
                    {
                        var elementType = GetElementType(context, element);
                        if (element.Name == "_id")
                        {
                            metadata.AddKeyProperty(collectionType, "ID", elementType);
                        }
                        else if (elementType == typeof(BsonDocument))
                        {
                            string referencedCollectionName = GetDocumentCollection(context, element.Value.AsBsonDocument).Name;
                            resourceReferences.Add(new Tuple<ResourceType, string, string>(collectionType, element.Name, referencedCollectionName));
                        }
                        else if (elementType == typeof(BsonArray))
                        {
                            var bsonArray = element.Value.AsBsonArray;
                            if (bsonArray != null && bsonArray.Count > 0)
                            {
                                string referencedCollectionName = GetDocumentCollection(context, bsonArray[0].AsBsonDocument).Name;
                                resourceSetReferences.Add(new Tuple<ResourceType, string, string>(collectionType, element.Name, referencedCollectionName));
                            }
                        }
                        else
                        {
                            metadata.AddPrimitiveProperty(collectionType, element.Name, elementType);
                        }
                    }
                    metadata.AddResourceSet(collectionName, collectionType);
                }
            }

            foreach (var reference in resourceReferences)
            {
                var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault();
                if (referencedResourceSet != null)
                {
                    metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet);
                }
            }

            foreach (var reference in resourceSetReferences)
            {
                var referencedResourceSet = metadata.ResourceSets.Where(x => x.Name == reference.Item3).SingleOrDefault();
                if (referencedResourceSet != null)
                {
                    metadata.AddResourceSetReferenceProperty(reference.Item1, reference.Item2, referencedResourceSet);
                }
            }
        }
コード例 #3
0
        public DSPInMemoryContext CreateContext(DSPMetadata metadata, string connectionString)
        {
            var dspContext = new DSPInMemoryContext();
            using (MongoContext mongoContext = new MongoContext(connectionString))
            {
                PopulateData(dspContext, mongoContext, metadata);
            }

            return dspContext;
        }
コード例 #4
0
        public DSPMetadata CreateMetadata()
        {
            var metadata = new DSPMetadata("MongoContext", "Northwind");

            using (MongoContext context = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString))
            {
                PopulateMetadata(metadata, context);
            }

            return metadata;
        }
コード例 #5
0
 private void PopulateData(DSPInMemoryContext dspContext, MongoContext mongoContext, DSPMetadata metadata)
 {
     foreach (var resourceSet in metadata.ResourceSets)
     {
         var storage = dspContext.GetResourceSetStorage(resourceSet.Name);
         var collection = mongoContext.Database.GetCollection(resourceSet.Name);
         foreach (var document in collection.FindAll())
         {
             var resource = MongoDSPConverter.CreateDSPResource(document, metadata, resourceSet.Name);
             storage.Add(resource);
         }
     }
 }
コード例 #6
0
        protected override void PopulateMetadata(DSPMetadata metadata, MongoContext context)
        {
            var itemsType = new ResourceType(typeof(Dictionary<string, object>),
                ResourceTypeKind.ComplexType, null, "Northwind", "Items", false);

            foreach (var collectionName in GetCollectionNames(context))
            {
                var collectionType = metadata.AddEntityType(collectionName);
                metadata.AddKeyProperty(collectionType, "Id", typeof(string));
                metadata.AddComplexProperty(collectionType, "Items", itemsType);
                metadata.AddResourceSet(collectionName, collectionType);
            }
        }
コード例 #7
0
        public DSPContext CreateContext(DSPMetadata metadata)
        {
            if (cachedContext == null)
            {
                lock (this)
                {
                    var dspContext = new DSPContext();
                    using (MongoContext mongoContext = new MongoContext(ConfigurationManager.ConnectionStrings["NorthwindContext.MongoDB"].ConnectionString))
                    {
                        foreach (var resourceSet in metadata.ResourceSets)
                        {
                            var entities = dspContext.GetResourceSetEntities(resourceSet.Name);
                            foreach (var bsonDocument in mongoContext.Database.GetCollection(resourceSet.Name).FindAll())
                            {
                                var resource = CreateDSPResource(resourceSet.ResourceType, bsonDocument);
                                entities.Add(resource);
                            }
                        }
                    }

                    foreach (var reference in resourceReferences)
                    {
                        resourceMap[reference.Item1].SetValue(reference.Item2, resourceMap[reference.Item3]);
                    }

                    foreach (var reference in resourceSetReferences)
                    {
                        var referencedCollection = new List<DSPResource>();
                        resourceMap[reference.Item1].SetValue(reference.Item2, referencedCollection);
                        foreach (var objectId in reference.Item3)
                        {
                            referencedCollection.Add(resourceMap[objectId]);
                        }
                    }

                    cachedContext = dspContext;
                }
            }
            return cachedContext;
        }
コード例 #8
0
        public object Clone()
        {
            var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName);

            var emptyResourceTypes = this.resourceTypes.Where(x =>
                                                              x.Value.ResourceTypeKind == ResourceTypeKind.ComplexType &&
                                                              !x.Value.Properties.Any());

            foreach (var resourceType in emptyResourceTypes)
            {
                AddPrimitiveProperty(resourceType.Value, "empty_content", typeof(byte[]));
            }

            foreach (var resourceType in this.resourceTypes)
            {
                dspMetadata.resourceTypes.Add(resourceType.Key, resourceType.Value.Clone());
            }
            foreach (var resourceSet in this.resourceSets)
            {
                dspMetadata.resourceSets.Add(resourceSet.Key, resourceSet.Value.Clone(dspMetadata.resourceTypes));
            }

            return(dspMetadata);
        }
コード例 #9
0
 public DSPQueryableContext CreateContext(DSPMetadata metadata, Dictionary<string, Type> providerTypes, string connectionString)
 {
     Func<string, IQueryable> queryProviders = x => GetQueryableCollection(connectionString, providerTypes, x);
     var dspContext = new DSPQueryableContext(metadata, queryProviders);
     return dspContext;
 }
コード例 #10
0
 protected abstract void PopulateMetadata(DSPMetadata metadata, MongoContext context);
コード例 #11
0
ファイル: DSPMetadata.cs プロジェクト: scbond/MongOData
        public object Clone()
        {
            var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName);

            this.resourceTypes.ToList().ForEach(x => dspMetadata.resourceTypes.Add(x.Key, x.Value.Clone()));
            this.resourceSets.ToList().ForEach(x => dspMetadata.resourceSets.Add(x.Key, x.Value.Clone(dspMetadata.resourceTypes)));

            return dspMetadata;
        }
コード例 #12
0
ファイル: DSPMetadata.cs プロジェクト: object/MongOData
        public object Clone()
        {
            var dspMetadata = new DSPMetadata(this.containerName, this.namespaceName);

            var emptyResourceTypes = this.resourceTypes.Where(x =>
                x.Value.ResourceTypeKind == ResourceTypeKind.ComplexType &&
                !x.Value.Properties.Any());
            foreach (var resourceType in emptyResourceTypes)
            {
                AddPrimitiveProperty(resourceType.Value, "empty_content", typeof(byte[]));
            }

            foreach (var resourceType in this.resourceTypes)
            {
                dspMetadata.resourceTypes.Add(resourceType.Key, resourceType.Value.Clone());
            }
            foreach (var resourceSet in this.resourceSets)
            {
                dspMetadata.resourceSets.Add(resourceSet.Key, resourceSet.Value.Clone(dspMetadata.resourceTypes));
            }

            return dspMetadata;
        }
コード例 #13
0
 public DSPContext CreateContext(DSPMetadata metadata)
 {
     return new DSPContext();
 }
コード例 #14
0
ファイル: DSPUpdateProvider.cs プロジェクト: scbond/MongOData
 /// <summary>Constructor.</summary>
 /// <param name="dataContext">The data context to apply the changes to.</param>
 /// <param name="metadata">The metadata describing the types to work with.</param>
 public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata)
 {
     this.dataContext = dataContext;
     this.metadata = metadata;
     this.pendingChanges = new List<Action>();
 }
コード例 #15
0
 /// <summary>Constructor.</summary>
 /// <param name="dataContext">The data context to apply the changes to.</param>
 /// <param name="metadata">The metadata describing the types to work with.</param>
 public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata)
 {
     _dataContext = dataContext;
     _metadata = metadata;
     _pendingChanges = new List<Action>();
 }
コード例 #16
0
 /// <summary>Constructor.</summary>
 /// <param name="dataContext">The data context to apply the changes to.</param>
 /// <param name="metadata">The metadata describing the types to work with.</param>
 public DSPUpdateProvider(DSPContext dataContext, DSPMetadata metadata)
 {
     this.dataContext    = dataContext;
     this.metadata       = metadata;
     this.pendingChanges = new List <Action>();
 }
コード例 #17
0
 public DSPQueryableContext(DSPMetadata metadata, Func<string, IQueryable> createQueryProvider)
 {
     this.metadata = metadata;
     this.createQueryProvider = createQueryProvider;
 }
コード例 #18
0
 public DSPQueryableContext(DSPMetadata metadata, Func <string, IQueryable> createQueryProvider)
 {
     this.metadata            = metadata;
     this.createQueryProvider = createQueryProvider;
 }