internal QueryCommand(IFingerprintCommandBuilder fingerprintCommandBuilder, IQueryFingerprintService queryFingerprintService) { this.fingerprintCommandBuilder = fingerprintCommandBuilder; this.queryFingerprintService = queryFingerprintService; FingerprintConfiguration = new EfficientFingerprintConfigurationForQuerying(); QueryConfiguration = new DefaultQueryConfiguration { FingerprintConfiguration = FingerprintConfiguration }; }
public void HammingSimilarityIsSummedUpAccrossAllSubFingerprintsTest() { var queryHash = new HashedFingerprint(GenericSignature(), GenericHashBuckets(), 0, 0, Enumerable.Empty<string>()); const int FirstTrackId = 20; const int FirstSubFingerprintId = 10; const int SecondSubFingerprintId = 11; var firstTrackReference = new ModelReference<int>(FirstTrackId); var firstResult = new SubFingerprintData(GenericHashBuckets(), 1, 0, new ModelReference<int>(FirstSubFingerprintId), firstTrackReference); var secondResult = new SubFingerprintData(GenericHashBuckets(), 2, 0.928, new ModelReference<int>(SecondSubFingerprintId), firstTrackReference); var defaultQueryConfiguration = new DefaultQueryConfiguration(); modelService.Setup(service => service.SupportsBatchedSubFingerprintQuery).Returns(false); modelService.Setup(service => service.ReadSubFingerprints(It.IsAny<long[]>(), defaultQueryConfiguration)) .Returns(new List<SubFingerprintData> { firstResult, secondResult }); modelService.Setup(service => service.ReadTrackByReference(firstTrackReference)) .Returns(new TrackData { ISRC = "isrc", TrackReference = firstTrackReference }); var queryResult = queryFingerprintService.Query(new List<HashedFingerprint> { queryHash }, defaultQueryConfiguration, modelService.Object); Assert.IsTrue(queryResult.ContainsMatches); Assert.AreEqual("isrc", queryResult.BestMatch.Track.ISRC); Assert.AreEqual(firstTrackReference, queryResult.BestMatch.Track.TrackReference); Assert.AreEqual(GenericSignature().Length * 2, queryResult.BestMatch.HammingSimilaritySum); Assert.AreEqual(1, queryResult.ResultEntries.Count()); }
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 MaximumNumberOfReturnedTracksIsLessThanAnalyzedCandidatesResultsTest() { var queryHash = new HashedFingerprint(GenericSignature(), GenericHashBuckets(), 1, 0, Enumerable.Empty<string>()); const int DefaultThreshold = 5; const int FirstTrackId = 20; const int SecondTrackId = 21; const int ThirdTrackId = 22; const int FirstSubFingerprintId = 10; const int SecondSubFingerprintId = 11; var firstTrackReference = new ModelReference<int>(FirstTrackId); var secondTrackReference = new ModelReference<int>(SecondTrackId); var firstResult = new SubFingerprintData( GenericHashBuckets(), 1, 0, new ModelReference<int>(FirstSubFingerprintId), firstTrackReference); var secondResult = new SubFingerprintData( GenericHashBuckets(), 2, 0.928, new ModelReference<int>(SecondSubFingerprintId), secondTrackReference); var thirdResult = new SubFingerprintData( GenericHashBuckets(), 3, 0.928 * 2, new ModelReference<int>(SecondSubFingerprintId), new ModelReference<int>(ThirdTrackId)); var customQueryConfiguration = new DefaultQueryConfiguration { MaxTracksToReturn = 2, ThresholdVotes = DefaultThreshold }; modelService.Setup(service => service.SupportsBatchedSubFingerprintQuery).Returns(false); modelService.Setup( service => service.ReadSubFingerprints(It.IsAny<long[]>(), customQueryConfiguration)).Returns( new List<SubFingerprintData> { firstResult, secondResult, thirdResult }); modelService.Setup(service => service.ReadTrackByReference(firstTrackReference)).Returns( new TrackData { ISRC = "isrc", TrackReference = firstTrackReference }); modelService.Setup(service => service.ReadTrackByReference(secondTrackReference)).Returns( new TrackData { ISRC = "isrc_1", TrackReference = secondTrackReference }); var queryResult = queryFingerprintService.Query(new List<HashedFingerprint> { queryHash }, customQueryConfiguration, modelService.Object); Assert.IsTrue(queryResult.ContainsMatches); Assert.AreEqual("isrc", queryResult.BestMatch.Track.ISRC); Assert.AreEqual(firstTrackReference, queryResult.BestMatch.Track.TrackReference); Assert.AreEqual(50, queryResult.BestMatch.HammingSimilaritySum); Assert.AreEqual(2, queryResult.ResultEntries.Count()); var results = queryResult.ResultEntries.ToList(); Assert.AreEqual(firstTrackReference, results[0].Track.TrackReference); Assert.AreEqual(secondTrackReference, results[1].Track.TrackReference); }
public void QueryCommandIsBuiltWithCustomQueryAndFingerprintConfigCorrectly() { var customQueryConfig = new DefaultQueryConfiguration(); var customFingerprintConfig = new DefaultFingerprintConfiguration(); var command = queryCommandBuilder.BuildQueryCommand() .From("path-to-file") .WithConfigs(customFingerprintConfig, customQueryConfig) .UsingServices(modelService.Object, audioService.Object); Assert.AreSame(command.QueryConfiguration, customQueryConfig); Assert.AreSame(command.FingerprintConfiguration, customFingerprintConfig); }
public void ShouldGetBestCandidatesByHammingDistance() { var modelService = new Mock<IModelService>(MockBehavior.Strict); var trackReference = new ModelReference<int>(3); modelService.Setup(s => s.ReadTrackByReference(trackReference)).Returns( new TrackData { ISRC = "isrc-1234-1234" }); var queryConfiguration = new DefaultQueryConfiguration { MaxTracksToReturn = 1 }; var query = new List<HashedFingerprint> { new HashedFingerprint(null, null, 1, 0d, Enumerable.Empty<string>()), new HashedFingerprint(null, null, 1, 4d, Enumerable.Empty<string>()), new HashedFingerprint(null, null, 1, 8d, Enumerable.Empty<string>()) }; var first = new ResultEntryAccumulator(query[0], new SubFingerprintData(null, 1, 0d, null, null), 100); var second = new ResultEntryAccumulator(query[1], new SubFingerprintData(null, 1, 4d, null, null), 99); var third = new ResultEntryAccumulator(query[2], new SubFingerprintData(null, 1, 8d, null, null), 101); var hammingSimilarties = new Dictionary<IModelReference, ResultEntryAccumulator> { { new ModelReference<int>(1), first }, { new ModelReference<int>(2), second }, { new ModelReference<int>(3), third }, }; var best = queryMath.GetBestCandidates( query, hammingSimilarties, queryConfiguration.MaxTracksToReturn, modelService.Object, queryConfiguration.FingerprintConfiguration); Assert.AreEqual(1, best.Count); Assert.AreEqual("isrc-1234-1234", best[0].Track.ISRC); Assert.AreEqual(9.48d, best[0].QueryLength, 0.01); Assert.AreEqual(0d, best[0].TrackStartsAt); modelService.VerifyAll(); }
public RealtimeQueryConfiguration(int thresholdVotes, IRealtimeResultEntryFilter resultEntryFilter, Action <ResultEntry> successCallback, Action <ResultEntry> didNotPassFilterCallback, Action <Hashes> queryFingerprintsCallback, Action <Exception, Hashes> errorCallback, Action restoredAfterErrorCallback, IEnumerable <Hashes> downtimeHashes, IStride stride, double permittedGap, double downtimeCapturePeriod, int millisecondsDelay, IDictionary <string, string> metaFieldFilters) { QueryConfiguration = new DefaultQueryConfiguration { ThresholdVotes = thresholdVotes, FingerprintConfiguration = new DefaultFingerprintConfiguration { SpectrogramConfig = new DefaultSpectrogramConfig { Stride = stride } }, YesMetaFieldsFilters = metaFieldFilters, PermittedGap = permittedGap }; ResultEntryFilter = resultEntryFilter; SuccessCallback = successCallback; DidNotPassFilterCallback = didNotPassFilterCallback; QueryFingerprintsCallback = queryFingerprintsCallback; ErrorCallback = errorCallback; RestoredAfterErrorCallback = restoredAfterErrorCallback; DowntimeHashes = downtimeHashes; DowntimeCapturePeriod = downtimeCapturePeriod; MillisecondsDelay = millisecondsDelay; }
public void NoResultsReturnedFromUnderlyingStorageTest() { var queryHash = new HashedFingerprint(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11 }, new long[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 0, 0, Enumerable.Empty<string>()); var customQueryConfiguration = new DefaultQueryConfiguration { MaxTracksToReturn = 1, ThresholdVotes = 10, FingerprintConfiguration = new DefaultFingerprintConfiguration() }; modelService.Setup(service => service.SupportsBatchedSubFingerprintQuery).Returns(false); modelService.Setup(service => service.ReadSubFingerprints(It.IsAny<long[]>(), customQueryConfiguration)).Returns(new List<SubFingerprintData>()); var queryResult = queryFingerprintService.Query(new List<HashedFingerprint> { queryHash }, customQueryConfiguration, modelService.Object); Assert.IsFalse(queryResult.ContainsMatches); Assert.IsNull(queryResult.BestMatch); Assert.AreEqual(0, queryResult.ResultEntries.Count()); }