private void AppendExtendedQueryTagKeyFilter(DicomTagSqlEntry dicomTagSqlEntry, string tableAlias, QueryFilterCondition filterCondition)
 {
     if (dicomTagSqlEntry.IsExtendedQueryTag)
     {
         _stringBuilder
         .Append(dicomTagSqlEntry.SqlKeyColumn, tableAlias)
         .Append("=")
         .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlKeyColumn, filterCondition.QueryTag.ExtendedQueryTagStoreEntry.Key))
         .AppendLine()
         .Append("AND ");
     }
 }
        public override void Visit(DateSingleValueMatchCondition dateSingleValueMatchCondition)
        {
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(dateSingleValueMatchCondition.DicomTag);
            var tableAlias       = GetTableAlias(dicomTagSqlEntry);

            _stringBuilder
            .Append("AND ")
            .Append(dicomTagSqlEntry.SqlColumn, tableAlias)
            .Append("=")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, dateSingleValueMatchCondition.Value.ToString(SqlDateFormat)))
            .AppendLine();
        }
        public override void Visit(DateRangeValueMatchCondition rangeValueMatchCondition)
        {
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(rangeValueMatchCondition.DicomTag);
            var tableAlias       = GetTableAlias(dicomTagSqlEntry);

            _stringBuilder
            .Append("AND ")
            .Append(dicomTagSqlEntry.SqlColumn, tableAlias).Append(" BETWEEN ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, rangeValueMatchCondition.Minimum.ToString(SqlDateFormat)))
            .Append(" AND ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, rangeValueMatchCondition.Maximum.ToString(SqlDateFormat)))
            .AppendLine();
        }
        private string GetTableAlias(DicomTagSqlEntry sqlEntry)
        {
            switch (sqlEntry.SqlTableType)
            {
            case SqlTableType.InstanceTable: return(InstanceTableAlias);

            case SqlTableType.StudyTable: return(StudyTableAlias);

            case SqlTableType.SeriesTable: return(SeriesTableAlias);
            }

            Debug.Fail("Invalid table type");
            return(null);
        }
        private static string GetTableAlias(DicomTagSqlEntry sqlEntry, int?extendedQueryTagKey)
        {
            string ret = null;

            switch (sqlEntry.SqlTableType)
            {
            case SqlTableType.InstanceTable:
                ret = InstanceTableAlias;
                break;

            case SqlTableType.StudyTable:
                ret = StudyTableAlias;
                break;

            case SqlTableType.SeriesTable:
                ret = SeriesTableAlias;
                break;

            case SqlTableType.ExtendedQueryTagLongTable:
                ret = ExtendedQueryTagLongTableAlias;
                break;

            case SqlTableType.ExtendedQueryTagDateTimeTable:
                ret = ExtendedQueryTagDateTimeTableAlias;
                break;

            case SqlTableType.ExtendedQueryTagDoubleTable:
                ret = ExtendedQueryTagDoubleTableAlias;
                break;

            case SqlTableType.ExtendedQueryTagPersonNameTable:
                ret = ExtendedQueryTagPersonNameTableAlias;
                break;

            case SqlTableType.ExtendedQueryTagStringTable:
                ret = ExtendedQueryTagStringTableAlias;
                break;
            }

            if (string.IsNullOrEmpty(ret))
            {
                Debug.Fail("Invalid table type");
                return(null);
            }

            return(ret + extendedQueryTagKey);
        }
        public override void Visit(DateSingleValueMatchCondition dateSingleValueMatchCondition)
        {
            var queryTag         = dateSingleValueMatchCondition.QueryTag;
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(queryTag);
            var tableAlias       = GetTableAlias(dicomTagSqlEntry, queryTag.IsExtendedQueryTag ? queryTag.ExtendedQueryTagStoreEntry.Key : null);

            _stringBuilder
            .Append("AND ");

            AppendExtendedQueryTagKeyFilter(dicomTagSqlEntry, tableAlias, dateSingleValueMatchCondition);

            _stringBuilder
            .Append(dicomTagSqlEntry.SqlColumn, tableAlias)
            .Append("=")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, dateSingleValueMatchCondition.Value.ToString(SqlDateFormat)))
            .AppendLine();
        }
        public override void Visit(PersonNameFuzzyMatchCondition fuzzyMatchCondition)
        {
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(fuzzyMatchCondition.DicomTag);

            char[]   delimiterChars = { ' ' };
            string[] words          = fuzzyMatchCondition.Value.Split(delimiterChars, System.StringSplitOptions.RemoveEmptyEntries);

            var fuzzyMatchString = string.Join(" AND ", words.Select(w => $"\"{w}*\""));
            var tableAlias       = GetTableAlias(dicomTagSqlEntry);

            _stringBuilder
            .Append("AND CONTAINS(")
            .Append(dicomTagSqlEntry.FullTextIndexColumnName)
            .Append(", ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, fuzzyMatchString))
            .Append(")")
            .AppendLine();
        }
        public override void Visit(LongRangeValueMatchCondition rangeValueMatchCondition)
        {
            var queryTag         = rangeValueMatchCondition.QueryTag;
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(queryTag);
            var tableAlias       = GetTableAlias(dicomTagSqlEntry, queryTag.IsExtendedQueryTag ? queryTag.ExtendedQueryTagStoreEntry.Key : null);

            _stringBuilder
            .Append("AND ");

            AppendExtendedQueryTagKeyFilter(dicomTagSqlEntry, tableAlias, rangeValueMatchCondition);

            _stringBuilder
            .Append(dicomTagSqlEntry.SqlColumn, tableAlias).Append(" BETWEEN ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, rangeValueMatchCondition.Minimum.ToString()))
            .Append(" AND ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, rangeValueMatchCondition.Maximum.ToString()))
            .AppendLine();
        }
        public override void Visit(PersonNameFuzzyMatchCondition fuzzyMatchCondition)
        {
            var queryTag         = fuzzyMatchCondition.QueryTag;
            var dicomTagSqlEntry = DicomTagSqlEntry.GetDicomTagSqlEntry(queryTag);
            var tableAlias       = GetTableAlias(dicomTagSqlEntry, queryTag.IsExtendedQueryTag ? queryTag.ExtendedQueryTagStoreEntry.Key : null);

            var fuzzyMatchString = $"\"{fuzzyMatchCondition.Value}*\"";

            _stringBuilder
            .Append("AND ");

            AppendExtendedQueryTagKeyFilter(dicomTagSqlEntry, tableAlias, fuzzyMatchCondition);
            _stringBuilder
            .Append("CONTAINS(")
            .Append(tableAlias)
            .Append(".")
            .Append(dicomTagSqlEntry.FullTextIndexColumnName)
            .Append(", ")
            .Append(_parameters.AddParameter(dicomTagSqlEntry.SqlColumn, fuzzyMatchString))
            .Append(")")
            .AppendLine();
        }