コード例 #1
0
        public string GenerateMongoCode(MongoDatabaseInfo databaseInfo, string collectionName, string linqQuery, string mode, out int injectedCodeStartPos)
        {
            var collectionInfo = databaseInfo.GetCollectionInfo(collectionName);

            var model = new CodeGenModel
            {
                LinqQuery           = linqQuery,
                MongoDatabaseInfo   = databaseInfo,
                MongoCollectionInfo = collectionInfo,
                Mode      = mode,
                ModelType = mode == MongoSharpQueryMode.Json || !collectionInfo.Models.Any()
                    ? "BsonDocument"
                    : collectionInfo.Namespace + "." + collectionInfo.Models[0].RootClassName
            };

            string code = new MongoCodeBehindGen(model).TransformText();

            injectedCodeStartPos = 0;
            var injectPos = code.IndexOf("#region Injected Code", StringComparison.CurrentCultureIgnoreCase);

            if (injectPos > 0)
            {
                injectedCodeStartPos = injectPos + "#region Injected Code".Length;
            }

            return(code);
        }
コード例 #2
0
        public static MongoCollectionSchema GetSchemaDocument(MongoDatabaseInfo databaseInfo, string collectionName, int maxSampleSize)
        {
            string key = $"{databaseInfo.Connection.Name}-{collectionName}";

            if (_docs.ContainsKey(key))
            {
                return(_docs[key]);
            }

            MongoCollection <BsonDocument> collection = databaseInfo.GetCollection(collectionName);
            long collectionSize = collection.Count();
            long sampleSize     = Math.Min(collectionSize, maxSampleSize);

            var cursor = collection.FindAll();

            cursor.SetSortOrder(SortBy.Descending("_id"));
            cursor.SetLimit((int)sampleSize);

            var docs = cursor.ToList();
            var doc  = new BsonDocumentBuilder().BuildDocument(docs);

            _docs.Add(key, new MongoCollectionSchema
            {
                SchemaDocument = doc,
                SampleSize     = sampleSize,
                CollectionSize = collectionSize
            });

            return(_docs[key]);
        }
コード例 #3
0
        public List <string> GetCollectionNames(MongoDatabaseInfo databaseInfo)
        {
            var client = new MongoClient(databaseInfo.Connection.GetConnectionString(databaseInfo.Name));
            var server = client.GetServer();
            var db     = server.GetDatabase(databaseInfo.Name);

            return
                (db.GetCollectionNames()
                 .Where(x => !x.StartsWith("system.", StringComparison.CurrentCultureIgnoreCase))
                 .ToList());
        }
コード例 #4
0
        public MongoDatabaseInfo AddDatabase(string name)
        {
            var dbInfo = new MongoDatabaseInfo
            {
                Name       = name,
                Connection = this
            };

            Databases.Add(dbInfo);
            return(dbInfo);
        }
コード例 #5
0
        public List <PropertyData> GetPropertiesPaths(MongoDatabaseInfo databaseInfo, string collectionName)
        {
            MongoCollectionModelInfo model = GetModel(databaseInfo, collectionName);

            if (string.IsNullOrWhiteSpace(model.ModelCode))
            {
                throw new Exception("Model does not exist");
            }

            var types    = new MongoDynamicCodeRunner().CompileModelCode(model.ModelCode);
            var rootType = types.Find(t => t.Name == model.RootClassName);

            if (rootType == null)
            {
                throw new Exception($"{model.RootClassName} class not found in Model.");
            }

            List <PropertyData> properties = ObjectHelper.ToPropertyPaths(rootType);

            return(properties);
        }
コード例 #6
0
        private MongoCollectionModelInfo GetModel(MongoDatabaseInfo databaseInfo, string collectionName)
        {
            MongoCollectionInfo collectionInfo = databaseInfo.GetCollectionInfo(collectionName);

            if (collectionInfo != null && collectionInfo.HasModel)
            {   // Model already exists for this collection.
                return(collectionInfo.Models[0]);
            }

            // Generate and save model code.
            var collection = databaseInfo.GetCollection(collectionName);
            var doc        = collection.FindOne();

            if (doc == null)
            {
                throw new Exception(
                          $"Collection '{collectionName}' is empty. Unable to determine schema from first document");
            }

            var schemaInfo = MongoCollectionSchemaStore.GetSchemaDocument(databaseInfo, collectionName);
            var classes    = new BsonDocumentConverter().ToCSharpClassDeclarations(schemaInfo.SchemaDocument, collectionName);

            var sb = new StringBuilder();

            foreach (var classSyntax in classes)
            {
                sb.AppendLine(classSyntax);
            }

            string modelCode = sb.ToString();

            MongoCollectionModelInfo newModel = databaseInfo.SetCollectionModel(collectionName, modelCode, "Doc0", true, (int)schemaInfo.SampleSize, schemaInfo.SamplePercent);

            Settings.Instance.Save();

            return(newModel);
        }
コード例 #7
0
 public static MongoCollectionSchema GetSchemaDocument(MongoDatabaseInfo databaseInfo, string collectionName)
 {
     return(GetSchemaDocument(databaseInfo, collectionName, 10000));
 }