public void InvalidMaximumNumberOfTracksToReturnIsSetOnQueryConfigurationInstanceTest()
        {
            var queryConfig = new CustomQueryConfiguration {
                MaximumNumberOfTracksToReturnAsResult = 0
            };

            Assert.Fail();
        }
        public void InvalidThresholdVotesIsSetOnQueryConfigurationInstanceTest()
        {
            var queryConfig = new CustomQueryConfiguration {
                ThresholdVotes = -1
            };

            Assert.Fail();
        }
        public void CustomQueryConfigurationInheritsDefaultValuesTest()
        {
            var queryConfiguration   = new CustomQueryConfiguration();
            var defaultConfiguration = new DefaultQueryConfiguration();

            Assert.AreEqual(defaultConfiguration.ThresholdVotes, queryConfiguration.ThresholdVotes);
            Assert.AreEqual(defaultConfiguration.MaximumNumberOfTracksToReturnAsResult, queryConfiguration.MaximumNumberOfTracksToReturnAsResult);
        }
        public void CustomQueryConfigurationParametersCanBeSuccessfullySetTest()
        {
            var queryConfiguration = new CustomQueryConfiguration {
                ThresholdVotes = 7, MaximumNumberOfTracksToReturnAsResult = 10
            };

            Assert.AreEqual(7, queryConfiguration.ThresholdVotes);
            Assert.AreEqual(10, queryConfiguration.MaximumNumberOfTracksToReturnAsResult);
        }
        /// <summary>
        ///   Find duplicates between existing tracks in the database
        /// </summary>
        /// <param name = "callback">Callback invoked at each processed track</param>
        /// <returns>Sets of duplicates</returns>
        public HashSet <TrackData>[] FindDuplicates(Action <TrackData, int, int> callback)
        {
            var tracks = modelService.ReadAllTracks();
            var duplicates = new List <HashSet <TrackData> >();
            int total = tracks.Count, current = 0;
            var queryConfiguration = new CustomQueryConfiguration {
                ThresholdVotes = ThresholdVotes, MaximumNumberOfTracksToReturnAsResult = int.MaxValue
            };

            foreach (var track in tracks)
            {
                var trackDuplicates = new HashSet <TrackData>();

                var hashes = modelService.ReadHashDataByTrack(track.TrackReference);
                var result = queryFingerprintService.Query(hashes, queryConfiguration);

                if (result.IsSuccessful)
                {
                    foreach (var resultEntry in result.ResultEntries)
                    {
                        if (track.Equals(resultEntry.Track))
                        {
                            continue;
                        }

                        if (MinimumHammingSimilarity > resultEntry.Similarity)
                        {
                            continue;
                        }

                        trackDuplicates.Add(resultEntry.Track);
                    }

                    if (trackDuplicates.Any())
                    {
                        HashSet <TrackData> duplicatePair = new HashSet <TrackData>(trackDuplicates)
                        {
                            track
                        };
                        duplicates.Add(duplicatePair);
                    }
                }

                if (callback != null)
                {
                    callback.Invoke(track, total, ++current);
                }
            }

            for (int i = 0; i < duplicates.Count - 1; i++)
            {
                HashSet <TrackData> set = duplicates[i];
                for (int j = i + 1; j < duplicates.Count; j++)
                {
                    IEnumerable <TrackData> result = set.Intersect(duplicates[j]);
                    if (result.Any())
                    {
                        foreach (var track in duplicates[j])
                        {
                            // collapse all duplicates in one set
                            set.Add(track);
                        }

                        duplicates.RemoveAt(j); /*Remove the duplicate set*/
                        j--;
                    }
                }
            }

            return(duplicates.ToArray());
        }
 protected override void ConfigureQuery(CustomQueryConfiguration config)
 {
     base.ConfigureQuery(config);
     config.ModelBuilderType = typeof(TransactionBillInvoiceModelBuilder);
 }