diff --git a/BuildFeed/BuildFeed.csproj b/BuildFeed/BuildFeed.csproj index 87a75d5..d5778a7 100644 --- a/BuildFeed/BuildFeed.csproj +++ b/BuildFeed/BuildFeed.csproj @@ -195,6 +195,7 @@ + diff --git a/BuildFeed/Code/LongIdGenerator.cs b/BuildFeed/Code/LongIdGenerator.cs new file mode 100644 index 0000000..6763123 --- /dev/null +++ b/BuildFeed/Code/LongIdGenerator.cs @@ -0,0 +1,42 @@ +using System; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.Bson.Serialization; + +namespace BuildFeed.Code +{ + public class LongIdGenerator : IIdGenerator + { + private const string _idCollectionName = "IDs"; + private MongoClient _dbClient; + private IMongoCollection _idCollection; + + public LongIdGenerator() + { + _dbClient = new MongoClient(new MongoClientSettings() + { + Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port) + }); + + _idCollection = _dbClient.GetDatabase(MongoConfig.Database).GetCollection(_idCollectionName); + } + + public object GenerateId(object container, object document) + { + var query = Query.EQ("_id", (container).Name); + + return (_idCollection.FindOneAndUpdateAsync(new FindAndModifyArgs() + { + Query = query, + Update = CreateUpdateBuilder(), + VersionReturned = FindAndModifyDocumentVersion.Modified, + Upsert = true + }).AsInt64.ModifiedDocument["seq"]); + } + + public bool IsEmpty(object id) + { + return ((long)id) == 0; + } + } +} \ No newline at end of file diff --git a/BuildFeed/Models/Build.cs b/BuildFeed/Models/Build.cs index 6031313..5598050 100644 --- a/BuildFeed/Models/Build.cs +++ b/BuildFeed/Models/Build.cs @@ -8,15 +8,16 @@ using Required = System.ComponentModel.DataAnnotations.RequiredAttribute; using System.Web.Mvc; using BuildFeed.Local; +using MongoDB.Driver; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; namespace BuildFeed.Models { [DataObject] - public class Build + public class BuildModel { - [Key] - [AutoIncrement] - [Index] + [Key, BsonId] public long Id { get; set; } [@Required] @@ -109,121 +110,115 @@ public string FullBuildString return sb.ToString(); } } + } + + public class Build + { + private const string _buildCollectionName = "builds"; + + private MongoClient _dbClient; + private IMongoCollection _buildCollection; + + public Build() + { + _dbClient = new MongoClient(new MongoClientSettings() + { + Server = new MongoServerAddress(MongoConfig.Host, MongoConfig.Port) + }); + + _buildCollection = _dbClient.GetDatabase(MongoConfig.Database).GetCollection(_buildCollectionName); + } [DataObjectMethod(DataObjectMethodType.Select, true)] - public static IEnumerable Select() + public IEnumerable Select() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - return client.GetAll(); - } + var task = _buildCollection.Find(new BsonDocument()).ToListAsync(); + task.Wait(); + return task.Result; } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static Build SelectById(long id) + public BuildModel SelectById(long id) { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - return client.GetById(id); - } + var task = _buildCollection.Find(f => f.Id == id).SingleOrDefaultAsync(); + task.Wait(); + return task.Result; } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectInBuildOrder() + public IEnumerable SelectInBuildOrder() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - return client.GetAll() - .OrderByDescending(b => b.BuildTime) - .ThenByDescending(b => b.MajorVersion) - .ThenByDescending(b => b.MinorVersion) - .ThenByDescending(b => b.Number) - .ThenByDescending(b => b.Revision); - } + var task = _buildCollection.Find(new BsonDocument()) + .SortByDescending(b => b.BuildTime) + .ThenByDescending(b => b.MajorVersion) + .ThenByDescending(b => b.MinorVersion) + .ThenByDescending(b => b.Number) + .ThenByDescending(b => b.Revision) + .ToListAsync(); + task.Wait(); + return task.Result; } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectInVersionOrder() + public IEnumerable SelectInVersionOrder() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - return client.GetAll() - .OrderByDescending(b => b.MajorVersion) - .ThenByDescending(b => b.MinorVersion) - .ThenByDescending(b => b.Number) - .ThenByDescending(b => b.Revision) - .ThenByDescending(b => b.BuildTime); - } + var task = _buildCollection.Find(new BsonDocument()) + .SortByDescending(b => b.MajorVersion) + .ThenByDescending(b => b.MinorVersion) + .ThenByDescending(b => b.Number) + .ThenByDescending(b => b.Revision) + .ThenByDescending(b => b.BuildTime) + .ToListAsync(); + task.Wait(); + return task.Result; } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectBuildVersions() + public IEnumerable SelectBuildVersions() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - var results = client.GetAll() - .GroupBy(b => new BuildVersion() { Major = b.MajorVersion, Minor = b.MinorVersion }) - .Select(b => new BuildVersion() { Major = b.First().MajorVersion, Minor = b.First().MinorVersion }) - .OrderByDescending(y => y.Major) - .ThenByDescending(y => y.Minor); - return results; - } + var task = _buildCollection.DistinctAsync(b => new BuildVersion() { Major = b.MajorVersion, Minor = b.MinorVersion }, b => true); + task.Wait(); + var outTask = task.Result.ToListAsync(); + outTask.Wait(); + return outTask.Result + .OrderByDescending(y => y.Major) + .ThenByDescending(y => y.Minor); } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectBuildYears() + public IEnumerable SelectBuildYears() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - var results = client.GetAll().Where(b => b.BuildTime.HasValue) - .GroupBy(b => b.BuildTime.Value.Year) - .Select(b => b.Key) - .OrderByDescending(y => y); - return results; - } + var task = _buildCollection.DistinctAsync(b => b.BuildTime.Value.Year, b => b.BuildTime.HasValue); + task.Wait(); + var outTask = task.Result.ToListAsync(); + outTask.Wait(); + return outTask.Result.OrderBy(b => b); } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectBuildLabs() + public IEnumerable SelectBuildLabs() { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - var results = client.GetAll() - .Where(b => !string.IsNullOrWhiteSpace(b.Lab)) - .GroupBy(b => b.Lab.ToLower()) - .Select(b => b.Key) - .OrderBy(s => s); - return results; - } + var task = _buildCollection.DistinctAsync(b => b.Lab.ToLower(), b => !string.IsNullOrWhiteSpace(b.Lab)); + task.Wait(); + var outTask = task.Result.ToListAsync(); + outTask.Wait(); + return outTask.Result.OrderBy(b => b); } [DataObjectMethod(DataObjectMethodType.Select, false)] - public static IEnumerable SelectBuildLabs(byte major, byte minor) + public IEnumerable SelectBuildLabs(byte major, byte minor) { - using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) - { - var client = rClient.As(); - var results = client.GetAll() - .Where(b => !string.IsNullOrWhiteSpace(b.Lab)) - .Where(b => b.MajorVersion == major) - .Where(b => b.MinorVersion == minor) - .GroupBy(b => b.Lab.ToLower()) - .Select(b => b.Key) - .OrderBy(s => s); - return results; - } + var task = _buildCollection.DistinctAsync(b => b.Lab.ToLower(), b => !string.IsNullOrWhiteSpace(b.Lab) && b.MajorVersion == major && b.MinorVersion == minor); + task.Wait(); + var outTask = task.Result.ToListAsync(); + outTask.Wait(); + return outTask.Result.OrderBy(b => b); } [DataObjectMethod(DataObjectMethodType.Insert, true)] - public static void Insert(Build item) + public void Insert(BuildModel item) { + item.Id = using (RedisClient rClient = new RedisClient(MongoConfig.Host, MongoConfig.Port, db: MongoConfig.Database)) { var client = rClient.As();