示例#1
0
        public static RismDbContext CreateContext()
        {
            var context = new RismDbContext(new DbContextOptionsBuilder().UseMySql("server=localhost;database=manufaktura-rism;uid=admin;pwd=123123").Options);

            context.ChangeTracker.AutoDetectChangesEnabled = false;
            context.ChangeTracker.QueryTrackingBehavior    = QueryTrackingBehavior.NoTracking;
            return(context);
        }
        public void Migrate(int maxRecords)
        {
            //var path = @"C:\Databases\rismAllMARCXMLexample\rism_130616_example.xml";
            var path    = @"C:\Databases\rismAllMARCXML\rism_170316.xml";
            var counter = 0;

            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                using (var reader = XmlReader.Create(fs, new XmlReaderSettings {
                    IgnoreWhitespace = true
                }))
                {
                    while (reader.Read() && reader.Name != "record")
                    {
                        reader.MoveToContent();
                    }
                    while (counter < maxRecords)
                    {
                        var record = reader.ReadOuterXml();
                        if (string.IsNullOrWhiteSpace(record))
                        {
                            break;
                        }

                        var recordElement = XElement.Parse(record);
                        var dbRecord      = ParseRecord(recordElement);
                        counter++;
                        Console.WriteLine($"Record {counter} ({dbRecord.Title} - {dbRecord.ComposerName}) added.");
                        if (counter % 100 == 0)
                        {
                            dbContext.SaveChanges();
                        }
                        if (counter % 600 == 0)
                        {
                            dbContext = Dependencies.CreateContext();                      //Recreate
                        }
                    }
                    dbContext.SaveChanges();
                }
            }
        }
 public SearchController([FromServices] RismDbContext context, PlaineAndEasieService plaineAndEasieService, ScoreRendererService scoreRendererService)
 {
     this.context = context;
     this.scoreRendererService  = scoreRendererService;
     this.plaineAndEasieService = plaineAndEasieService;
 }
示例#4
0
        public void GenerateHashes()
        {
            var pageSize          = 2000;
            var processedincipits = 0;

            while (true)
            {
                var sw = new Stopwatch();
                sw.Start();

                if (processedincipits % 10000 == 0)
                {
                    dbContext = Dependencies.CreateContext();                                  //Recreate
                }
                Console.WriteLine($"Searching for incipits...");
                var incipits = GetIncipitsBatch(pageSize);

                var numberOfPlanes = 40;

                Console.WriteLine($"Processing hashes for incipits...");
                foreach (var incipit in incipits)
                {
                    for (var numberOfDimensions = 1; numberOfDimensions <= Constants.MaxNumberOfDimensionsForLsh; numberOfDimensions++)
                    {
                        var position = GetIncipitVector(new[] {
                            incipit.Interval1,
                            incipit.Interval2,
                            incipit.Interval3,
                            incipit.Interval4,
                            incipit.Interval5,
                            incipit.Interval6,
                            incipit.Interval7,
                            incipit.Interval8,
                            incipit.Interval9,
                            incipit.Interval10,
                            incipit.Interval11,
                            incipit.Interval12
                        }.Take(numberOfDimensions).ToArray());

                        var lshAlgorithm = GetPlaneGroup(1, numberOfPlanes, numberOfDimensions);
                        var hash         = lshAlgorithm.ComputeHash(position);

                        if (numberOfDimensions == 1)
                        {
                            incipit.Hash1d = hash;
                        }
                        if (numberOfDimensions == 2)
                        {
                            incipit.Hash2d = hash;
                        }
                        if (numberOfDimensions == 3)
                        {
                            incipit.Hash3d = hash;
                        }
                        if (numberOfDimensions == 4)
                        {
                            incipit.Hash4d = hash;
                        }
                        if (numberOfDimensions == 5)
                        {
                            incipit.Hash5d = hash;
                        }
                        if (numberOfDimensions == 6)
                        {
                            incipit.Hash6d = hash;
                        }
                    }
                    dbContext.Entry(incipit).State = EntityState.Modified;
                }
                dbContext.SaveChanges();

                processedincipits += incipits.Length;

                sw.Stop();
                var timeRemaining = TimeSpan.FromSeconds(((1775885 - processedincipits) / pageSize) * sw.Elapsed.TotalSeconds);

                Console.WriteLine($"Completed {processedincipits} incipits. Time remaining: {timeRemaining}.");



                if (incipits.Length < pageSize)
                {
                    break;
                }
            }
        }
示例#5
0
 public HashGenerationServiceInIncipitTable(RismDbContext dbContext)
 {
     this.dbContext = dbContext;
 }
示例#6
0
 public HashGenerationServiceForDistinctIncipits(RismDbContext dbContext, PlaineAndEasieService plaineAndEasieService)
 {
     this.dbContext             = dbContext;
     this.plaineAndEasieService = plaineAndEasieService;
 }
示例#7
0
        public void GenerateHashes(int numberOfGroups)
        {
            var incipitCache = new List <Incipit>();

            for (var numberOfDimensions = 1; numberOfDimensions <= Constants.MaxNumberOfDimensionsForLsh; numberOfDimensions++)
            {
                var hashCache = new List <SpatialHash>();

                dbContext = Dependencies.CreateContext();  //Recreate
                Console.WriteLine($"Searching distinct melodies for {numberOfDimensions} dimensions...");
                var distinctMelodies = GetDistinctMelodies(numberOfDimensions);
                Console.WriteLine($"Found {distinctMelodies.Length} distinct melodies for {numberOfDimensions} dimensions.");

                var patternNumber = 1;
                foreach (var distinctIntervalPattern in distinctMelodies)
                {
                    Console.WriteLine($"Generating {numberOfDimensions}-dimensional hashes for pattern {string.Join(" ", distinctIntervalPattern)} ({patternNumber++} of {distinctMelodies.Length}).");

                    var position       = GetIncipitVector(distinctIntervalPattern);
                    var numberOfPlanes = 15;    //There's no use to increase number of planes according to number of dimensions. Planes always divide space in two.

                    Console.WriteLine($"Searching incipit ids for pattern {string.Join(" ", distinctIntervalPattern)}...");
                    var allIncipitsForThisPattern = numberOfDimensions == 1 ? GetIncipitsByIntervalPatternFromDb(distinctIntervalPattern, incipitCache)
                        : GetIncipitsByIntervalPatternFromCache(distinctIntervalPattern, incipitCache);

                    foreach (var groupNumber in Enumerable.Range(1, numberOfGroups))
                    {
                        var lshAlgorithm = GetPlaneGroup(groupNumber, numberOfPlanes, numberOfDimensions);
                        var hash         = lshAlgorithm.ComputeHash(position);

                        var spatialHash = new SpatialHash {
                            Id = $"{numberOfDimensions}-{groupNumber}-{hash}"
                        };
                        var existingHash = hashCache.FirstOrDefault(h => h.Id == spatialHash.Id);
                        if (existingHash == null)
                        {
                            dbContext.SpatialHashes.Add(spatialHash);
                            dbContext.SaveChanges();
                            hashCache.Add(spatialHash);
                        }
                        else
                        {
                            spatialHash = existingHash;
                        }

                        var skip     = 0;
                        var pageSize = 300;
                        while (true)
                        {
                            Console.WriteLine($"Adding incipit ids for pattern {string.Join(" ", distinctIntervalPattern)} - group {groupNumber} ({skip}/{allIncipitsForThisPattern.Length})...");
                            var page = allIncipitsForThisPattern.Skip(skip).Take(pageSize).ToArray();
                            foreach (var incipit in page)
                            {
                                dbContext.SpatialHashIncipits.Add(new SpatialHashIncipit {
                                    SpatialHashId = spatialHash.Id, IncipitId = incipit.Id
                                });
                            }
                            dbContext.SaveChanges();

                            if (page.Length < pageSize)
                            {
                                break;
                            }
                            skip += page.Length;
                        }
                    }

                    dbContext.SaveChanges();
                    dbContext = Dependencies.CreateContext();  //Recreate
                }
                dbContext.SaveChanges();
            }
        }
 public MigrationService(RismDbContext dbContext, PlaineAndEasieService plaineAndEasieService)
 {
     this.dbContext             = dbContext;
     this.plaineAndEasieService = plaineAndEasieService;
 }