public void GivenSupportedDicomElement_WhenRead_ThenShouldReturnExpectedValue(DicomElement element, object expectedValue)
        {
            DicomDataset dataset = new DicomDataset();

            dataset.Add(element);
            QueryTag tag        = new QueryTag(element.Tag.BuildExtendedQueryTagStoreEntry(vr: element.ValueRepresentation.Code));
            var      parameters = AddInstanceTableValuedParametersBuilder.Build(dataset, new QueryTag[] { tag });

            ExtendedQueryTagDataType dataType = ExtendedQueryTagLimit.ExtendedQueryTagVRAndDataTypeMapping[element.ValueRepresentation.Code];

            switch (dataType)
            {
            case ExtendedQueryTagDataType.StringData:
                Assert.Equal(expectedValue, parameters.StringExtendedQueryTags.First().TagValue);
                break;

            case ExtendedQueryTagDataType.LongData:
                Assert.Equal(expectedValue, parameters.LongExtendedQueryTags.First().TagValue);
                break;

            case ExtendedQueryTagDataType.DoubleData:
                Assert.Equal(expectedValue, parameters.DoubleExtendedQueryTags.First().TagValue);
                break;

            case ExtendedQueryTagDataType.DateTimeData:
                Assert.Equal(expectedValue, parameters.DateTimeExtendedQueryTags.First().TagValue);
                break;

            case ExtendedQueryTagDataType.PersonNameData:
                Assert.Equal(expectedValue, parameters.PersonNameExtendedQueryTags.First().TagValue);
                break;
            }
        }
        internal async Task GivenDicomInstanceWithDifferentTypeOfExtendedQueryTags_WhenStore_ThenTheyShouldBeStoredInProperTable(ExtendedQueryTagDataType dataType, DicomElement element, object expectedValue)
        {
            string       studyInstanceUid  = TestUidGenerator.Generate();
            string       seriesInstanceUid = TestUidGenerator.Generate();
            string       sopInstanceUid    = TestUidGenerator.Generate();
            DicomDataset dataset           = Samples.CreateRandomInstanceDataset(studyInstanceUid, seriesInstanceUid, sopInstanceUid);

            dataset.Add(element);
            QueryTagLevel level = QueryTagLevel.Study;
            var           extendedQueryTagEntry = element.Tag.BuildAddExtendedQueryTagEntry(level: level);

            QueryTag queryTag = await AddExtendedQueryTag(extendedQueryTagEntry);

            try
            {
                long watermark = await CreateInstanceIndexAsync(dataset, new QueryTag[] { queryTag });

                Instance instance = await _testHelper.GetInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, watermark);

                IReadOnlyList <ExtendedQueryTagDataRow> rows = await _extendedQueryTagStoreTestHelper.GetExtendedQueryTagDataAsync(dataType, queryTag.ExtendedQueryTagStoreEntry.Key, instance.StudyKey);

                Assert.Single(rows);
                Assert.Equal(watermark, rows[0].Watermark);
                Assert.Equal(expectedValue, rows[0].TagValue);
            }
            finally
            {
                await _extendedQueryTagStore.DeleteExtendedQueryTagAsync(extendedQueryTagEntry.Path, extendedQueryTagEntry.VR);
            }
        }
Пример #3
0
        public void GivenStringExtendedQueryTagFilter_WhenIELevelStudy_ValidateExtendedQueryTagFilter()
        {
            var stringBuilder = new IndentedStringBuilder(new StringBuilder());
            var includeField  = new QueryIncludeField(false, new List <DicomTag>());
            var queryTag      = new QueryTag(DicomTag.ModelGroupUID.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));
            var filter        = new StringSingleValueMatchCondition(queryTag, "123");

            filter.QueryTag = queryTag;
            var filters = new List <QueryFilterCondition>()
            {
                filter,
            };
            var query = new QueryExpression(QueryResource.AllStudies, includeField, false, 0, 0, filters);

            SqlParameterCollection sqlParameterCollection = CreateSqlParameterCollection();
            var parm = new SqlQueryParameterManager(sqlParameterCollection);

            new SqlQueryGenerator(stringBuilder, query, parm);

            string expectedExtendedQueryTagTableFilter = @"INNER JOIN dbo.ExtendedQueryTagString cts1
ON cts1.StudyKey = st.StudyKey
WHERE";

            string expectedFilters = @"AND cts1.TagKey=@p0
AND cts1.TagValue=@p1";

            string builtString = stringBuilder.ToString();

            Assert.Equal(queryTag.ExtendedQueryTagStoreEntry.Key.ToString(), sqlParameterCollection[0].Value.ToString());
            Assert.Equal(filter.Value.ToString(), sqlParameterCollection[1].Value.ToString());
            Assert.Contains(expectedExtendedQueryTagTableFilter, builtString);
            Assert.Contains(expectedFilters, builtString);
        }
Пример #4
0
        public void GivenDateTimeExtendedQueryTagFilter_WhenIELevelStudy_ValidateExtendedQueryTagFilter()
        {
            var stringBuilder = new IndentedStringBuilder(new StringBuilder());
            var includeField  = new QueryIncludeField(new List <DicomTag>());
            var queryTag      = new QueryTag(DicomTag.DateTime.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));
            var filter        = new DateRangeValueMatchCondition(queryTag, DateTime.ParseExact("19510910111213.123", QueryParser.DateTimeTagValueFormats, null), DateTime.ParseExact("19571110111213.123", QueryParser.DateTimeTagValueFormats, null));

            filter.QueryTag = queryTag;
            var filters = new List <QueryFilterCondition>()
            {
                filter,
            };
            var query = new QueryExpression(QueryResource.AllStudies, includeField, false, 0, 0, filters, Array.Empty <string>());

            SqlParameterCollection sqlParameterCollection = CreateSqlParameterCollection();
            var parm = new SqlQueryParameterManager(sqlParameterCollection);

            new SqlQueryGenerator(stringBuilder, query, parm, SqlServer.Features.Schema.SchemaVersion.V4, DefaultPartition.Key);

            string expectedExtendedQueryTagTableFilter = @"INNER JOIN dbo.ExtendedQueryTagDateTime ctdt1
ON ctdt1.PartitionKey = st.PartitionKey
AND ctdt1.StudyKey = st.StudyKey
WHERE";

            string expectedFilters = @"AND ctdt1.TagKey=@p0
AND ctdt1.TagValue BETWEEN @p1 AND @p2";

            string builtString = stringBuilder.ToString();

            Assert.Equal(queryTag.ExtendedQueryTagStoreEntry.Key.ToString(), sqlParameterCollection[0].Value.ToString());
            Assert.Equal(filter.Minimum.ToString(SqlDateFormat), sqlParameterCollection[1].Value.ToString());
            Assert.Equal(filter.Maximum.ToString(SqlDateFormat), sqlParameterCollection[2].Value.ToString());
            Assert.Contains(expectedExtendedQueryTagTableFilter, builtString);
            Assert.Contains(expectedFilters, builtString);
        }
Пример #5
0
        private static QueryFilterCondition ParseTimeTagValue(QueryTag queryTag, string value)
        {
            if (QueryLimit.IsValidRangeQueryTag(queryTag))
            {
                var splitString = value.Split('-');
                if (splitString.Length == 2)
                {
                    string minTime = splitString[0].Trim();
                    string maxTime = splitString[1].Trim();

                    // Make sure both parts of the range values are not empty.
                    // If so, throw an exception.
                    ValidateEmptyValuesForRangeQuery(minTime, maxTime);

                    long parsedMinTime = string.IsNullOrEmpty(minTime) ? 0 : ParseTime(minTime, queryTag);
                    long parsedMaxTime = string.IsNullOrEmpty(maxTime) ? TimeSpan.TicksPerDay : ParseTime(maxTime, queryTag);

                    if (parsedMinTime > parsedMaxTime)
                    {
                        throw new QueryParseException(string.Format(
                                                          DicomCoreResource.InvalidTimeRangeValue,
                                                          value,
                                                          minTime,
                                                          maxTime));
                    }

                    return(new LongRangeValueMatchCondition(queryTag, parsedMinTime, parsedMaxTime));
                }
            }

            long parsedTime = ParseTime(value, queryTag);

            return(new LongSingleValueMatchCondition(queryTag, parsedTime));
        }
Пример #6
0
        public void GivenPatientNameFilterForExtendedQueryTag_WithFuzzyMatchMultiWord_ValidateContainsFilterGenerated()
        {
            var stringBuilder = new IndentedStringBuilder(new StringBuilder());
            var includeField  = new QueryIncludeField(new List <DicomTag>());
            var queryTag      = new QueryTag(DicomTag.ConsultingPhysicianName.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            var filter        = new PersonNameFuzzyMatchCondition(queryTag, "Fall 6");

            filter.QueryTag = queryTag;
            var filters = new List <QueryFilterCondition>()
            {
                filter,
            };
            var query = new QueryExpression(QueryResource.AllInstances, includeField, true, 10, 0, filters, Array.Empty <string>());
            SqlParameterCollection sqlParameterCollection = CreateSqlParameterCollection();
            var parm = new SqlQueryParameterManager(sqlParameterCollection);

            new SqlQueryGenerator(stringBuilder, query, parm, SqlServer.Features.Schema.SchemaVersion.V4, DefaultPartition.Key);

            string expectedParam = $"\"Fall 6*\"";

            string expectedFilters = @"AND ctpn1.TagKey=@p0
AND CONTAINS(ctpn1.TagValueWords, @p1)";

            Assert.Equal(queryTag.ExtendedQueryTagStoreEntry.Key.ToString(), sqlParameterCollection[0].Value.ToString());
            Assert.Equal(expectedParam, sqlParameterCollection[1].Value.ToString());
            Assert.Contains(expectedFilters, stringBuilder.ToString());
        }
Пример #7
0
        public void GivenDoubleExtendedQueryTagFilter_WhenIELevelStudy_ValidateExtendedQueryTagFilter()
        {
            var stringBuilder = new IndentedStringBuilder(new StringBuilder());
            var includeField  = new QueryIncludeField(new List <DicomTag>());
            var queryTag      = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));
            var filter        = new DoubleSingleValueMatchCondition(queryTag, 123D);

            filter.QueryTag = queryTag;
            var filters = new List <QueryFilterCondition>()
            {
                filter,
            };
            var query = new QueryExpression(QueryResource.AllStudies, includeField, false, 0, 0, filters, Array.Empty <string>());

            SqlParameterCollection sqlParameterCollection = CreateSqlParameterCollection();
            var parm = new SqlQueryParameterManager(sqlParameterCollection);

            new SqlQueryGenerator(stringBuilder, query, parm, SqlServer.Features.Schema.SchemaVersion.V4, DefaultPartition.Key);

            string expectedExtendedQueryTagTableFilter = @"INNER JOIN dbo.ExtendedQueryTagDouble ctd1
ON ctd1.PartitionKey = st.PartitionKey
AND ctd1.StudyKey = st.StudyKey
WHERE";

            string expectedFilters = @"AND ctd1.TagKey=@p0
AND ctd1.TagValue=@p1";

            string builtString = stringBuilder.ToString();

            Assert.Equal(queryTag.ExtendedQueryTagStoreEntry.Key.ToString(), sqlParameterCollection[0].Value.ToString());
            Assert.Equal(filter.Value.ToString(), sqlParameterCollection[1].Value.ToString());
            Assert.Contains(expectedExtendedQueryTagTableFilter, builtString);
            Assert.Contains(expectedFilters, builtString);
        }
Пример #8
0
        private static QueryFilterCondition ParseDateOrTimeTagValue(QueryTag queryTag, string value, string exceptionBaseMessage, Func <string, string, DateTime> parseValue)
        {
            if (QueryLimit.IsValidRangeQueryTag(queryTag))
            {
                var splitString = value.Split('-');
                if (splitString.Length == 2)
                {
                    string minDateTime = splitString[0].Trim();
                    string maxDateTime = splitString[1].Trim();

                    // Make sure both parts of the range values are not empty.
                    // If so, throw an exception.
                    ValidateEmptyValuesForRangeQuery(minDateTime, maxDateTime);

                    DateTime parsedMinDateTime = string.IsNullOrEmpty(minDateTime) ? DateTime.MinValue : parseValue(minDateTime, queryTag.GetName());
                    DateTime parsedMaxDateTime = string.IsNullOrEmpty(maxDateTime) ? DateTime.MaxValue : parseValue(maxDateTime, queryTag.GetName());

                    if (parsedMinDateTime > parsedMaxDateTime)
                    {
                        throw new QueryParseException(string.Format(
                                                          exceptionBaseMessage,
                                                          value,
                                                          minDateTime,
                                                          maxDateTime));
                    }

                    return(new DateRangeValueMatchCondition(queryTag, parsedMinDateTime, parsedMaxDateTime));
                }
            }

            DateTime parsedDateTime = parseValue(value, queryTag.GetName());

            return(new DateSingleValueMatchCondition(queryTag, parsedDateTime));
        }
Пример #9
0
        public void GivenDateTime_WithEmptyMinAndMaxInRangeMatch_Throw()
        {
            QueryTag queryTag = new QueryTag(DicomTag.DateTime.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));

            Assert.Throws <QueryParseException>(() => _queryParser
                                                .Parse(CreateParameters(GetSingleton("DateTime", "-"), QueryResource.AllStudies), new[] { queryTag }));
        }
        private static QueryFilterCondition ParseDateTagValue(QueryTag queryTag, string value)
        {
            if (QueryLimit.IsValidRangeQueryTag(queryTag))
            {
                var splitString = value.Split('-');
                if (splitString.Length == 2)
                {
                    string   minDate       = splitString[0].Trim();
                    string   maxDate       = splitString[1].Trim();
                    DateTime parsedMinDate = ParseDate(minDate, queryTag.GetName());
                    DateTime parsedMaxDate = ParseDate(maxDate, queryTag.GetName());

                    if (parsedMinDate > parsedMaxDate)
                    {
                        throw new QueryParseException(string.Format(
                                                          DicomCoreResource.InvalidDateRangeValue,
                                                          value,
                                                          minDate,
                                                          maxDate));
                    }

                    return(new DateRangeValueMatchCondition(queryTag, parsedMinDate, parsedMaxDate));
                }
            }

            DateTime parsedDate = ParseDate(value, queryTag.GetName());

            return(new DateSingleValueMatchCondition(queryTag, parsedDate));
        }
Пример #11
0
        public async Task GivenExistingExtendedQueryTagIndexData_WhenDeleteExtendedQueryTag_ThenShouldDeleteIndexData()
        {
            DicomTag tag = DicomTag.DeviceSerialNumber;

            // Prepare index data
            DicomDataset dataset = Samples.CreateRandomInstanceDataset();

            dataset.Add(tag, "123");

            await AddExtendedQueryTagsAsync(new AddExtendedQueryTagEntry[] { tag.BuildAddExtendedQueryTagEntry() });

            ExtendedQueryTagStoreEntry storeEntry = await _extendedQueryTagStore.GetExtendedQueryTagAsync(tag.GetPath());

            QueryTag queryTag  = new QueryTag(storeEntry);
            long     watermark = await _indexDataStore.BeginCreateInstanceIndexAsync(1, dataset, new QueryTag[] { queryTag });

            await _indexDataStore.EndCreateInstanceIndexAsync(1, dataset, watermark, new QueryTag[] { queryTag });

            var extendedQueryTagIndexData = await _extendedQueryTagStoreTestHelper.GetExtendedQueryTagDataForTagKeyAsync(ExtendedQueryTagDataType.StringData, storeEntry.Key);

            Assert.NotEmpty(extendedQueryTagIndexData);

            // Delete tag
            await _extendedQueryTagStore.DeleteExtendedQueryTagAsync(storeEntry.Path, storeEntry.VR);

            await VerifyTagNotExistAsync(storeEntry.Path);

            // Verify index data is removed
            extendedQueryTagIndexData = await _extendedQueryTagStoreTestHelper.GetExtendedQueryTagDataForTagKeyAsync(ExtendedQueryTagDataType.StringData, storeEntry.Key);

            Assert.Empty(extendedQueryTagIndexData);
        }
Пример #12
0
        /// <summary>
        /// Obtiene una implementación de una consulta que puede cambiar según la base de datos.
        /// </summary>
        /// <remarks>
        ///     Registro de versiones:
        ///
        ///         1.0 07/08/2015 Marcos Abraham Hernández Bravo (Ada Ltda.): versión inicial.
        /// </remarks>
        /// <param name="clase">Clase mediante reflexión, que contiene el método que desea acceder a la base de datos.</param>
        /// <param name="nombre">Nombre de la consulta en el archivo de configuración.</param>
        public DynamicQuery CrearQueryDinamica(Type clase, string nombre)
        {
            QueryTag consulta = DynamicQueryManager.ObtenerConsulta(nombre, conexion.Type, clase);

            Query aux = null;

            if (consulta.Tipo == "StoreProcedure")
            {
                aux = CrearProcedimientoAlmacenado();
            }
            else if (consulta.Tipo == "Query")
            {
                aux = CrearQuery();
            }
            else
            {
                throw new PreparacionException(string.Format("¡El tipo de consulta {0} no es válida!", consulta.Tipo));
            }

            DynamicQuery retorno = new DynamicQuery(this, aux.Mapeador, aux.CreadorQuery);

            retorno.TipoBaseDatos = conexion.Type;
            retorno.Nombre        = nombre;
            retorno.Tipo          = consulta.Tipo;
            retorno.Consulta      = consulta.Consulta;
            return(retorno);
        }
Пример #13
0
        public async Task GivenValidAndInvalidTagValues_WhenValidate_ThenReturnedValidTagsAndStoredFailure()
        {
            DicomTag     tag1     = DicomTag.DeviceSerialNumber;
            DicomTag     tag2     = DicomTag.DeviceID;
            DicomDataset ds       = Samples.CreateRandomInstanceDataset();
            DicomElement element1 = new DicomLongString(tag1, "testvalue1");
            DicomElement element2 = new DicomLongString(tag2, "testvalue2");

            ds.Add(element1);
            ds.Add(element2);
            QueryTag queryTag1 = new QueryTag(new ExtendedQueryTagStoreEntry(1, tag1.GetPath(), tag1.GetDefaultVR().Code, null, QueryTagLevel.Instance, ExtendedQueryTagStatus.Ready, QueryStatus.Enabled, 0));
            QueryTag queryTag2 = new QueryTag(new ExtendedQueryTagStoreEntry(2, tag2.GetPath(), tag2.GetDefaultVR().Code, null, QueryTagLevel.Instance, ExtendedQueryTagStatus.Ready, QueryStatus.Enabled, 0));

            // Throw exception when validate element1
            var ex = ElementValidationExceptionFactory.CreateDateIsInvalidException("testname", "testvalue");

            _minimumValidator.When(x => x.Validate(element1))
            .Throw(ex);

            // only return querytag2
            long watermark      = 1;
            var  validQueryTags = await _datasetValidator.ValidateAsync(ds, watermark, new[] { queryTag1, queryTag2 });

            Assert.Single(validQueryTags);
            Assert.Same(queryTag2, validQueryTags.First());

            // error for querytag1 is logged
            await _tagErrorsService.Received(1)
            .AddExtendedQueryTagErrorAsync(queryTag1.ExtendedQueryTagStoreEntry.Key, ex.ErrorCode, 1, Arg.Any <CancellationToken>());
        }
        private async Task ValidateAddNewExtendedQueryTagIndexData(QueryTagLevel level)
        {
            string       studyInstanceUid  = TestUidGenerator.Generate();
            string       seriesInstanceUid = TestUidGenerator.Generate();
            string       sopInstanceUid    = TestUidGenerator.Generate();
            DicomDataset dataset           = Samples.CreateRandomInstanceDataset(studyInstanceUid, seriesInstanceUid, sopInstanceUid);
            DicomTag     tag   = DicomTag.ConversionType;
            string       value = "SYN";

            dataset.Add(tag, value);

            QueryTag queryTag = await AddExtendedQueryTag(tag.BuildAddExtendedQueryTagEntry(level: level));

            try
            {
                long watermark = await CreateInstanceIndexAsync(dataset, new QueryTag[] { queryTag });

                Instance instance = await _testHelper.GetInstanceAsync(studyInstanceUid, seriesInstanceUid, sopInstanceUid, watermark);

                long?seriesKey   = level != QueryTagLevel.Study ? instance.SeriesKey : null;
                long?instanceKey = level == QueryTagLevel.Instance ? instance.InstanceKey : null;
                var  stringRows  = await _extendedQueryTagStoreTestHelper.GetExtendedQueryTagDataAsync(ExtendedQueryTagDataType.StringData, queryTag.ExtendedQueryTagStoreEntry.Key, instance.StudyKey, seriesKey, instanceKey);

                Assert.Single(stringRows);
                Assert.Equal(stringRows[0].TagValue, value);
                Assert.Equal(stringRows[0].Watermark, watermark);
            }
            finally
            {
                await _extendedQueryTagStore.DeleteExtendedQueryTagAsync(queryTag.ExtendedQueryTagStoreEntry.Path, queryTag.ExtendedQueryTagStoreEntry.VR);
            }
        }
Пример #15
0
        public async Task GivenSeriesTag_WhenReindexWithOldInstance_ThenTagValueShouldNotBeUpdated()
        {
            DicomTag tag       = DicomTag.AcquisitionDeviceProcessingCode;
            string   tagValue1 = "test1";
            string   tagValue2 = "test2";

            string studyUid  = TestUidGenerator.Generate();
            string seriesUid = TestUidGenerator.Generate();

            DicomDataset dataset1 = Samples.CreateRandomInstanceDataset(studyUid, seriesUid);

            dataset1.Add(tag, tagValue1);
            DicomDataset dataset2 = Samples.CreateRandomInstanceDataset(studyUid, seriesUid);

            dataset2.Add(tag, tagValue2);
            Instance instance1 = await CreateInstanceIndexAsync(dataset1);

            Instance instance2 = await CreateInstanceIndexAsync(dataset2);

            var tagStoreEntry = await AddExtendedQueryTagAsync(tag.BuildAddExtendedQueryTagEntry(level: QueryTagLevel.Series));

            QueryTag queryTag = new QueryTag(tagStoreEntry);

            await _indexDataStore.ReindexInstanceAsync(dataset2, instance2.Watermark, new[] { queryTag });

            await _indexDataStore.ReindexInstanceAsync(dataset1, instance1.Watermark, new[] { queryTag });

            var row = (await _extendedQueryTagStoreTestHelper.GetExtendedQueryTagDataAsync(ExtendedQueryTagDataType.StringData, tagStoreEntry.Key, instance1.StudyKey, instance1.SeriesKey, null)).First();

            Assert.Equal(tagValue2, row.TagValue);
        }
Пример #16
0
        public void GivenNonExistingExtendedQueryStringTag_WithUrl_ParseFails()
        {
            QueryTag queryTag = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));

            Assert.Throws <QueryParseException>(() => _queryParser
                                                .Parse(CreateParameters(GetSingleton(nameof(DicomTag.ModelGroupUID), "abc"), QueryResource.AllStudies), new[] { queryTag }));
        }
Пример #17
0
        public void GivenExtendedQueryDoubleTag_WithUrl_ParseSucceeds()
        {
            QueryTag        queryTag        = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateParameters(GetSingleton(nameof(DicomTag.FloatingPointValue), "1.1"), QueryResource.AllSeries), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
Пример #18
0
        public void GivenExtendedQueryLongTag_WithUrl_ParseSucceeds()
        {
            QueryTag        queryTag        = new QueryTag(DicomTag.NumberOfAssessmentObservations.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateParameters(GetSingleton(nameof(DicomTag.NumberOfAssessmentObservations), "50"), QueryResource.AllSeries), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
Пример #19
0
        public void GivenExtendedQueryStringTag_WithTagPathUrl_ParseSucceeds()
        {
            QueryTag        queryTag        = new QueryTag(DicomTag.ModelGroupUID.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateParameters(GetSingleton("00687004", "abc"), QueryResource.AllSeries), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
        public void GivenExtendedQueryLongTag_WithUrl_ParseSucceeds()
        {
            var             queryString     = "NumberOfAssessmentObservations=50";
            QueryTag        queryTag        = new QueryTag(DicomTag.NumberOfAssessmentObservations.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllSeries), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
Пример #21
0
        public void GivenExtendedQueryTimeTag_WithUrl_ParseSucceeds()
        {
            QueryTag queryTag = new QueryTag(DicomTag.Time.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));

            QueryExpression queryExpression = _queryParser.Parse(CreateParameters(GetSingleton("Time", "195109.10-195110.20"), QueryResource.AllStudies), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
        public void GivenExtendedQueryDoubleTag_WithUrl_ParseSucceeds()
        {
            var             queryString     = "FloatingPointValue=1.1";
            QueryTag        queryTag        = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllSeries), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
        public void GivenNonExistingExtendedQueryStringTag_WithUrl_ParseFails()
        {
            var      queryString = "ModelGroupUID=abc";
            QueryTag queryTag    = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));

            Assert.Throws <QueryParseException>(() => _queryParser
                                                .Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllStudies), new[] { queryTag }));
        }
        public void GivenExtendedQueryDateTag_WithUrl_ParseSucceeds()
        {
            var      queryString = "Date=19510910-20200220";
            QueryTag queryTag    = new QueryTag(DicomTag.Date.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Study));

            QueryExpression queryExpression = _queryParser.Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllStudies), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
Пример #25
0
        private static QueryFilterCondition ParseLongTagValue(QueryTag queryTag, string value)
        {
            if (!long.TryParse(value, out long val))
            {
                throw new QueryParseException(string.Format(DicomCoreResource.InvalidLongValue, value, queryTag.GetName()));
            }

            return(new LongSingleValueMatchCondition(queryTag, val));
        }
Пример #26
0
        public void GivenExtendedQueryPrivateTag_WithUrl_ParseSucceeds()
        {
            DicomTag tag      = new DicomTag(0x0405, 0x1001, "PrivateCreator1");
            QueryTag queryTag = new QueryTag(tag.BuildExtendedQueryTagStoreEntry(vr: DicomVRCode.CS, level: QueryTagLevel.Study));

            QueryExpression queryExpression = _queryParser.Parse(CreateParameters(GetSingleton(tag.GetPath(), "Test"), QueryResource.AllStudies), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
        public void GivenCombinationOfExtendedQueryAndStandardTags_WithUrl_ParseSucceeds()
        {
            var             queryString     = "PatientName=Joe&FloatingPointValue=1.1&StudyDate=19510910-20200220&00687004=abc";
            QueryTag        queryTag1       = new QueryTag(DicomTag.FloatingPointValue.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryTag        queryTag2       = new QueryTag(DicomTag.ModelGroupUID.BuildExtendedQueryTagStoreEntry(level: QueryTagLevel.Series));
            QueryExpression queryExpression = _queryParser.Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllSeries), QueryTagService.CoreQueryTags.Concat(new[] { queryTag1, queryTag2 }).ToList());

            Assert.Equal(4, queryExpression.FilterConditions.Count);
            Assert.Contains(queryTag1, queryExpression.FilterConditions.Select(x => x.QueryTag));
            Assert.Contains(queryTag2, queryExpression.FilterConditions.Select(x => x.QueryTag));
        }
Пример #28
0
        public void GivenCoreDicomTag_WhenInitialize_ThenShouldCreatedSuccessfully()
        {
            DicomTag tag      = DicomTag.PatientName;
            QueryTag queryTag = new QueryTag(tag);

            Assert.Equal(tag, queryTag.Tag);
            Assert.Equal(DicomVR.PN, queryTag.VR);
            Assert.Null(queryTag.ExtendedQueryTagStoreEntry);
            Assert.False(queryTag.IsExtendedQueryTag);
            Assert.Equal(QueryTagLevel.Study, queryTag.Level);
        }
        public void GivenExtendedQueryPrivateTag_WithUrl_ParseSucceeds()
        {
            DicomTag tag         = new DicomTag(0x0405, 0x1001, "PrivateCreator1");
            string   value       = "Test";
            var      queryString = $"{tag.GetPath()}={value}";
            QueryTag queryTag    = new QueryTag(tag.BuildExtendedQueryTagStoreEntry(vr: DicomVRCode.CS, level: QueryTagLevel.Study));

            QueryExpression queryExpression = _queryParser.Parse(CreateRequest(GetQueryCollection(queryString), QueryResource.AllStudies), new[] { queryTag });

            Assert.Equal(queryTag, queryExpression.FilterConditions.First().QueryTag);
        }
Пример #30
0
        public async Task GivenExtendedQueryTags_WhenValidating_ThenExtendedQueryTagsShouldBeValidated()
        {
            DicomTag standardTag = DicomTag.DestinationAE;

            // AE > 16 characters is not allowed
            _dicomDataset.Add(standardTag, "01234567890123456");

            QueryTag indextag = new QueryTag(standardTag.BuildExtendedQueryTagStoreEntry());

            _queryTags.Add(indextag);
            await ExecuteAndValidateException <ElementValidationException>(ValidationFailedFailureCode);
        }