internal void Read(SqlDataReader sqlDataReader, ExtendedQueryTagDataType dataType)
        {
            switch (dataType)
            {
            case ExtendedQueryTagDataType.StringData:
                TagValue = sqlDataReader.GetString(1);
                break;

            case ExtendedQueryTagDataType.LongData:
                TagValue = sqlDataReader.GetInt64(1);
                break;

            case ExtendedQueryTagDataType.DoubleData:
                TagValue = sqlDataReader.GetDouble(1);
                break;

            case ExtendedQueryTagDataType.DateTimeData:
                TagValue = sqlDataReader.GetDateTime(1);
                break;

            case ExtendedQueryTagDataType.PersonNameData:
                TagValue = sqlDataReader.GetString(1);
                break;

            default:
                break;
            }

            ReadOthers(sqlDataReader);
        }
        async Task <IReadOnlyList <ExtendedQueryTagDataRow> > IExtendedQueryTagStoreTestHelper.GetExtendedQueryTagDataAsync(
            ExtendedQueryTagDataType dataType,
            int tagKey,
            long studyKey,
            long?seriesKey,
            long?instanceKey,
            CancellationToken cancellationToken)
        {
            var    results          = new List <ExtendedQueryTagDataRow>();
            string tagKeyParam      = "@tagKey";
            string studyKeyParam    = "@studyKey";
            string seriesKeyParam   = "@seriesKey";
            string instanceKeyParam = "@instanceKey";

            // Columns on all extended query tag index data tables are of same names
            string studyKeyColName    = VLatest.ExtendedQueryTagString.StudyKey.Metadata.Name;
            string seriesKeyColName   = VLatest.ExtendedQueryTagString.SeriesKey.Metadata.Name;
            string instanceKeyColName = VLatest.ExtendedQueryTagString.InstanceKey.Metadata.Name;
            string tagKeyName         = VLatest.ExtendedQueryTagString.TagKey.Metadata.Name;
            string seriesFilter       = seriesKey.HasValue ? $"{seriesKeyColName} = {seriesKeyParam}" : $"{seriesKeyColName} IS NULL";
            string instanceFilter     = instanceKey.HasValue ? $"{instanceKeyColName} = {instanceKeyParam}" : $"{instanceKeyColName} IS NULL";

            return(await GetExtendedQueryTagRowsAsync(
                       dataType,
                       sqlCommand =>
            {
                sqlCommand.CommandText = @$ "
                        SELECT *
                        FROM {DateTypeAndTableNameMapping[dataType]}
                        WHERE 
                            {tagKeyName} = {tagKeyParam}
                            AND {studyKeyColName} = {studyKeyParam}
        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;
            }
        }
        public static ExtendedQueryTagDataRows Build(
            DicomDataset instance,
            IEnumerable <QueryTag> queryTags,
            SchemaVersion schemaVersion)
        {
            EnsureArg.IsNotNull(instance, nameof(instance));
            EnsureArg.IsNotNull(queryTags, nameof(queryTags));

            var stringRows          = new List <InsertStringExtendedQueryTagTableTypeV1Row>();
            var longRows            = new List <InsertLongExtendedQueryTagTableTypeV1Row>();
            var doubleRows          = new List <InsertDoubleExtendedQueryTagTableTypeV1Row>();
            var dateTimeRows        = new List <InsertDateTimeExtendedQueryTagTableTypeV1Row>();
            var dateTimeWithUtcRows = new List <InsertDateTimeExtendedQueryTagTableTypeV2Row>();
            var personNameRows      = new List <InsertPersonNameExtendedQueryTagTableTypeV1Row>();

            foreach (QueryTag queryTag in queryTags.Where(x => x.IsExtendedQueryTag))
            {
                // Create row
                ExtendedQueryTagDataType dataType = ExtendedQueryTagLimit.ExtendedQueryTagVRAndDataTypeMapping[queryTag.VR.Code];
                switch (dataType)
                {
                case ExtendedQueryTagDataType.StringData: AddStringRow(instance, stringRows, queryTag); break;

                case ExtendedQueryTagDataType.LongData: AddLongRow(instance, longRows, queryTag); break;

                case ExtendedQueryTagDataType.DoubleData: AddDoubleRow(instance, doubleRows, queryTag); break;

                case ExtendedQueryTagDataType.DateTimeData:
                    if ((int)schemaVersion < SchemaVersionConstants.SupportDTAndTMInExtendedQueryTagSchemaVersion)
                    {
                        AddDateTimeRow(instance, dateTimeRows, queryTag);
                    }
                    else
                    {
                        AddDateTimeWithUtcRow(instance, dateTimeWithUtcRows, queryTag);
                    }
                    break;

                case ExtendedQueryTagDataType.PersonNameData: AddPersonNameRow(instance, personNameRows, queryTag); break;

                default:
                    Debug.Fail($"Not able to handle {dataType}");
                    break;
                }
            }

            return(new ExtendedQueryTagDataRows
            {
                StringRows = stringRows,
                LongRows = longRows,
                DoubleRows = doubleRows,
                DateTimeRows = dateTimeRows,
                DateTimeWithUtcRows = dateTimeWithUtcRows,
                PersonNameRows = personNameRows,
            });
        }
        /// <summary>
        /// Read Index Tag values from DicomDataset.
        /// </summary>
        /// <param name="instance">The dicom dataset.</param>
        /// <param name="queryTags">The index tags.</param>
        public static VLatest.AddInstanceTableValuedParameters Build(
            DicomDataset instance,
            IEnumerable <QueryTag> queryTags)
        {
            EnsureArg.IsNotNull(instance, nameof(instance));
            EnsureArg.IsNotNull(queryTags, nameof(queryTags));

            List <InsertStringExtendedQueryTagTableTypeV1Row>     stringRows    = new List <InsertStringExtendedQueryTagTableTypeV1Row>();
            List <InsertLongExtendedQueryTagTableTypeV1Row>       longRows      = new List <InsertLongExtendedQueryTagTableTypeV1Row>();
            List <InsertDoubleExtendedQueryTagTableTypeV1Row>     doubleRows    = new List <InsertDoubleExtendedQueryTagTableTypeV1Row>();
            List <InsertDateTimeExtendedQueryTagTableTypeV1Row>   dateTimeRows  = new List <InsertDateTimeExtendedQueryTagTableTypeV1Row>();
            List <InsertPersonNameExtendedQueryTagTableTypeV1Row> personNamRows = new List <InsertPersonNameExtendedQueryTagTableTypeV1Row>();

            foreach (var queryTag in queryTags)
            {
                ExtendedQueryTagDataType dataType = ExtendedQueryTagLimit.ExtendedQueryTagVRAndDataTypeMapping[queryTag.VR.Code];
                switch (dataType)
                {
                case ExtendedQueryTagDataType.StringData:
                    AddStringRow(instance, stringRows, queryTag);

                    break;

                case ExtendedQueryTagDataType.LongData:
                    AddLongRow(instance, longRows, queryTag);

                    break;

                case ExtendedQueryTagDataType.DoubleData:
                    AddDoubleRow(instance, doubleRows, queryTag);

                    break;

                case ExtendedQueryTagDataType.DateTimeData:
                    AddDateTimeRow(instance, dateTimeRows, queryTag);

                    break;

                case ExtendedQueryTagDataType.PersonNameData:
                    AddPersonNameRow(instance, personNamRows, queryTag);

                    break;

                default:
                    Debug.Fail($"Not able to handle {dataType}");
                    break;
                }
            }

            return(new VLatest.AddInstanceTableValuedParameters(stringRows, longRows, doubleRows, dateTimeRows, personNamRows));
        }
        public void GivenSupportedDicomElement_WhenRead_ThenShouldReturnExpectedValue(DicomElement element, int schemaVersion, object expectedValue)
        {
            DicomDataset dataset = new DicomDataset();

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

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

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

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

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

            case ExtendedQueryTagDataType.DateTimeData:
                if (schemaVersion < SchemaVersionConstants.SupportDTAndTMInExtendedQueryTagSchemaVersion)
                {
                    Assert.Equal(expectedValue, parameters.DateTimeRows.First().TagValue);
                }
                else
                {
                    Assert.Equal(expectedValue, parameters.DateTimeWithUtcRows.First().TagValue);
                }
                break;

            case ExtendedQueryTagDataType.PersonNameData:
                Assert.Equal(expectedValue, parameters.PersonNameRows.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);
            }
        }
Пример #8
0
        private void AppendExtendedQueryTagTables()
        {
            foreach (QueryFilterCondition condition in _queryExpression.FilterConditions.Where(x => x.QueryTag.IsExtendedQueryTag))
            {
                QueryTag queryTag = condition.QueryTag;
                int      tagKey   = queryTag.ExtendedQueryTagStoreEntry.Key;
                ExtendedQueryTagDataType dataType = ExtendedQueryTagLimit.ExtendedQueryTagVRAndDataTypeMapping[queryTag.VR.Code];
                string extendedQueryTagTableAlias = null;
                _stringBuilder.Append("INNER JOIN ");
                switch (dataType)
                {
                case ExtendedQueryTagDataType.StringData:
                    extendedQueryTagTableAlias = ExtendedQueryTagStringTableAlias + tagKey;
                    _stringBuilder.AppendLine($"{VLatest.ExtendedQueryTagString.TableName} {extendedQueryTagTableAlias}");

                    break;

                case ExtendedQueryTagDataType.LongData:
                    extendedQueryTagTableAlias = ExtendedQueryTagLongTableAlias + tagKey;
                    _stringBuilder.AppendLine($"{VLatest.ExtendedQueryTagLong.TableName} {extendedQueryTagTableAlias}");

                    break;

                case ExtendedQueryTagDataType.DoubleData:
                    extendedQueryTagTableAlias = ExtendedQueryTagDoubleTableAlias + tagKey;
                    _stringBuilder.AppendLine($"{VLatest.ExtendedQueryTagDouble.TableName} {extendedQueryTagTableAlias}");

                    break;

                case ExtendedQueryTagDataType.DateTimeData:
                    extendedQueryTagTableAlias = ExtendedQueryTagDateTimeTableAlias + tagKey;
                    _stringBuilder.AppendLine($"{VLatest.ExtendedQueryTagDateTime.TableName} {extendedQueryTagTableAlias}");

                    break;

                case ExtendedQueryTagDataType.PersonNameData:
                    extendedQueryTagTableAlias = ExtendedQueryTagPersonNameTableAlias + tagKey;
                    _stringBuilder.AppendLine($"{VLatest.ExtendedQueryTagPersonName.TableName} {extendedQueryTagTableAlias}");

                    break;
                }

                _stringBuilder
                .Append("ON ")
                .Append($"{extendedQueryTagTableAlias}.PartitionKey")
                .Append(" = ")
                .AppendLine(VLatest.Study.PartitionKey, StudyTableAlias);

                _stringBuilder
                .Append("AND ")
                .Append($"{extendedQueryTagTableAlias}.StudyKey")
                .Append(" = ")
                .AppendLine(VLatest.Study.StudyKey, StudyTableAlias);

                using (IndentedStringBuilder.DelimitedScope delimited = _stringBuilder.BeginDelimitedOnClause())
                {
                    if ((_queryExpression.IsSeriesIELevel() || _queryExpression.IsInstanceIELevel()) && queryTag.Level < QueryTagLevel.Study)
                    {
                        _stringBuilder
                        .Append("AND ")
                        .Append($"{extendedQueryTagTableAlias}.SeriesKey")
                        .Append(" = ")
                        .AppendLine(VLatest.Series.SeriesKey, SeriesTableAlias);
                    }

                    if (_queryExpression.IsInstanceIELevel() && queryTag.Level < QueryTagLevel.Series)
                    {
                        _stringBuilder
                        .Append("AND ")
                        .Append($"{extendedQueryTagTableAlias}.InstanceKey")
                        .Append(" = ")
                        .AppendLine(VLatest.Instance.InstanceKey, InstanceTableAlias);
                    }
                }
            }
        }