public virtual void Visit(SqlFreeTextTable node)
 {
     VisitInternal(node.Asterisk);
     foreach (SqlTableColumn column in node.Columns)
     {
         VisitInternal(column);
     }
     VisitInternal(node.FreeText);
     foreach (SqlTableColumn column in node.TargetColumns)
     {
         VisitInternal(column);
     }
     VisitInternal(node.TargetTable);
 }
Example #2
0
 public void Visit(SqlFreeTextTable node)
 {
     if (node.TargetTable != null)
     {
         Visit(node.TargetTable);
     }
     foreach (var column in node.Columns)
     {
         Visit(column);
     }
     foreach (var column in node.TargetColumns)
     {
         Visit(column);
     }
 }
Example #3
0
        public override void Visit(SqlFreeTextTable node)
        {
            string columns;

            if (node.TargetColumns.Count == 1)
            {
                columns = node.TargetColumns[0] == node.Asterisk
          ? node.TargetColumns[0].Name
          : translator.QuoteIdentifier(node.TargetColumns[0].Name);
            }
            else
            {
                columns = string.Join(", ", node.TargetColumns.Select(c => translator.QuoteIdentifier(c.Name)).ToArray());
            }
            context.Output.AppendText(string.Format(
                                          "FREETEXTTABLE({0}, {1}, ", translator.Translate(context, node.TargetTable.DataTable), columns));
            node.FreeText.AcceptVisitor(this);
            if (node.TopNByRank != null)
            {
                context.Output.AppendText(", ");
                node.TopNByRank.AcceptVisitor(this);
            }
            context.Output.AppendText(") ");
        }
Example #4
0
        public override void Visit(SqlFreeTextTable node)
        {
            if (node.TargetColumns.Count != 1 || node.TargetColumns[0] != node.TargetTable.Asterisk)
            {
                throw new NotSupportedException(Strings.ExFreeTextSearchOnCustomColumnsNotSupported);
            }

            var fullTextIndex       = node.TargetTable.DataTable.Indexes.OfType <FullTextIndex>().Single();
            var alias               = context.TableNameProvider.GetName(node);
            var vector              = ((Translator)translator).GetFulltextVector(context, fullTextIndex);
            var tableName           = translator.QuoteIdentifier(node.TargetTable.Name);
            var internalColumnIndex = 0;

            while (node.Columns["column" + internalColumnIndex] != null)
            {
                internalColumnIndex++;
            }
            var vectorName = translator.QuoteIdentifier("column" + internalColumnIndex);

            internalColumnIndex++;
            while (node.Columns["column" + internalColumnIndex] != null)
            {
                internalColumnIndex++;
            }

            var queryName = translator.QuoteIdentifier("column" + internalColumnIndex);

            context.Output.AppendText("(SELECT ");
            for (var columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++)
            {
                if (columnIndex != 0)
                {
                    context.Output.AppendText(translator.ColumnDelimiter);
                }
                context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name));
            }
            context.Output.AppendText(translator.ColumnDelimiter);
            context.Output.AppendText("ts_rank_cd(");
            context.Output.AppendText(vectorName);
            context.Output.AppendText(translator.ArgumentDelimiter);
            context.Output.AppendText(queryName);
            context.Output.AppendText(") AS");
            context.Output.AppendText(translator.QuoteIdentifier(node.Columns[node.Columns.Count - 1].Name));
            context.Output.AppendText(" FROM (SELECT ");
            for (var columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++)
            {
                if (columnIndex != 0)
                {
                    context.Output.AppendText(translator.ColumnDelimiter);
                }
                context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name));
            }
            context.Output.AppendText(translator.ColumnDelimiter);
            context.Output.AppendText(string.Format("{0} AS {1}", vector, vectorName));
            context.Output.AppendText(translator.ColumnDelimiter);

            var languages = fullTextIndex
                            .Columns
                            .SelectMany(column => column.Languages)
                            .Select(language => language.Name)
                            .Distinct();

            context.Output.AppendText("(");

            var isFirst = true;

            foreach (var language in languages)
            {
                if (!isFirst)
                {
                    context.Output.AppendText(" || ");
                }
                isFirst = false;

                context.Output.AppendText("to_tsquery('");
                context.Output.AppendText(language);
                context.Output.AppendText("'::regconfig, ");
                context.Output.AppendText("replace(trim(regexp_replace(");
                node.FreeText.AcceptVisitor(this);
                context.Output.AppendText(@",'\\W+', ' ', 'g')),' ', '|')");
                context.Output.AppendText(")");
            }
            context.Output.AppendText(")");

            context.Output.AppendText($" AS {queryName}");
            context.Output.AppendText($" FROM {tableName}) AS {alias} WHERE {vectorName} @@ {queryName})");
        }
Example #5
0
 public override void Visit(SqlFreeTextTable node)
 {
     throw SqlHelper.NotSupported("FreeText");
 }
Example #6
0
 /// <inheritdoc/>
 public override void Visit(SqlFreeTextTable node)
 {
     //See Readme.txt point 6.
     throw SqlHelper.NotSupported("FreeText");
 }