Header And Logo

PostgreSQL
| The world's most advanced open source database.

Defines | Functions

tsquery_op.c File Reference

#include "postgres.h"
#include "tsearch/ts_utils.h"
Include dependency graph for tsquery_op.c:

Go to the source code of this file.

Defines

#define CMPFUNC(NAME, CONDITION)

Functions

Datum tsquery_numnode (PG_FUNCTION_ARGS)
static QTNodejoin_tsqueries (TSQuery a, TSQuery b, int8 operator)
Datum tsquery_and (PG_FUNCTION_ARGS)
Datum tsquery_or (PG_FUNCTION_ARGS)
Datum tsquery_not (PG_FUNCTION_ARGS)
static int CompareTSQ (TSQuery a, TSQuery b)
Datum tsquery_cmp (PG_FUNCTION_ARGS)
 CMPFUNC (tsquery_lt, res< 0)
 CMPFUNC (tsquery_le, res<=0)
 CMPFUNC (tsquery_eq, res==0)
 CMPFUNC (tsquery_ge, res >=0)
 CMPFUNC (tsquery_gt, res > 0)
 CMPFUNC (tsquery_ne, res!=0)
TSQuerySign makeTSQuerySign (TSQuery a)
Datum tsq_mcontains (PG_FUNCTION_ARGS)
Datum tsq_mcontained (PG_FUNCTION_ARGS)

Define Documentation

#define CMPFUNC (   NAME,
  CONDITION 
)
Value:
Datum                                           \
NAME(PG_FUNCTION_ARGS) {                        \
    TSQuery  a = PG_GETARG_TSQUERY_COPY(0);     \
    TSQuery  b = PG_GETARG_TSQUERY_COPY(1);     \
    int res = CompareTSQ(a,b);                  \
                                                \
    PG_FREE_IF_COPY(a,0);                       \
    PG_FREE_IF_COPY(b,1);                       \
                                                \
    PG_RETURN_BOOL( CONDITION );                \
}   \
/* keep compiler quiet - no extra ; */          \
extern int no_such_variable

Definition at line 177 of file tsquery_op.c.


Function Documentation

CMPFUNC ( tsquery_lt   ) 
CMPFUNC ( tsquery_le  ,
res<=  0 
)
CMPFUNC ( tsquery_eq  ,
res  = =0 
)
CMPFUNC ( tsquery_ge  ,
res >=  0 
)
CMPFUNC ( tsquery_gt  ,
res  ,
 
)
CMPFUNC ( tsquery_ne  ,
res!  = 0 
)
static int CompareTSQ ( TSQuery  a,
TSQuery  b 
) [static]

Definition at line 139 of file tsquery_op.c.

References GETOPERAND, GETQUERY, QT2QTN(), QTNFree(), QTNodeCompare(), TSQueryData::size, and VARSIZE.

Referenced by tsquery_cmp().

{
    if (a->size != b->size)
    {
        return (a->size < b->size) ? -1 : 1;
    }
    else if (VARSIZE(a) != VARSIZE(b))
    {
        return (VARSIZE(a) < VARSIZE(b)) ? -1 : 1;
    }
    else if (a->size != 0)
    {
        QTNode     *an = QT2QTN(GETQUERY(a), GETOPERAND(a));
        QTNode     *bn = QT2QTN(GETQUERY(b), GETOPERAND(b));
        int         res = QTNodeCompare(an, bn);

        QTNFree(an);
        QTNFree(bn);

        return res;
    }

    return 0;
}

static QTNode* join_tsqueries ( TSQuery  a,
TSQuery  b,
int8  operator 
) [static]

Definition at line 30 of file tsquery_op.c.

References QTNode::child, QTNode::flags, GETOPERAND, GETQUERY, QTNode::nchild, QueryOperator::oper, palloc0(), QueryItem::qoperator, QT2QTN(), QueryItem::type, and QTNode::valnode.

Referenced by tsquery_and(), and tsquery_or().

{
    QTNode     *res = (QTNode *) palloc0(sizeof(QTNode));

    res->flags |= QTN_NEEDFREE;

    res->valnode = (QueryItem *) palloc0(sizeof(QueryItem));
    res->valnode->type = QI_OPR;
    res->valnode->qoperator.oper = operator;

    res->child = (QTNode **) palloc0(sizeof(QTNode *) * 2);
    res->child[0] = QT2QTN(GETQUERY(b), GETOPERAND(b));
    res->child[1] = QT2QTN(GETQUERY(a), GETOPERAND(a));
    res->nchild = 2;

    return res;
}

TSQuerySign makeTSQuerySign ( TSQuery  a  ) 

Definition at line 200 of file tsquery_op.c.

References GETQUERY, i, QI_VAL, QueryItem::qoperand, sign, TSQueryData::size, QueryItem::type, and QueryOperand::valcrc.

Referenced by gtsquery_compress(), gtsquery_consistent(), and tsq_mcontains().

{
    int         i;
    QueryItem  *ptr = GETQUERY(a);
    TSQuerySign sign = 0;

    for (i = 0; i < a->size; i++)
    {
        if (ptr->type == QI_VAL)
            sign |= ((TSQuerySign) 1) << (((unsigned int) ptr->qoperand.valcrc) % TSQS_SIGLEN);
        ptr++;
    }

    return sign;
}

Datum tsq_mcontained ( PG_FUNCTION_ARGS   ) 
Datum tsq_mcontains ( PG_FUNCTION_ARGS   ) 

Definition at line 217 of file tsquery_op.c.

References GETQUERY, i, makeTSQuerySign(), PG_FREE_IF_COPY, PG_GETARG_TSQUERY, PG_RETURN_BOOL, QI_VAL, QueryItem::qoperand, TSQueryData::size, NODE::type, and QueryOperand::valcrc.

Referenced by tsq_mcontained().

{
    TSQuery     query = PG_GETARG_TSQUERY(0);
    TSQuery     ex = PG_GETARG_TSQUERY(1);
    TSQuerySign sq,
                se;
    int         i,
                j;
    QueryItem  *iq,
               *ie;

    if (query->size < ex->size)
    {
        PG_FREE_IF_COPY(query, 0);
        PG_FREE_IF_COPY(ex, 1);

        PG_RETURN_BOOL(false);
    }

    sq = makeTSQuerySign(query);
    se = makeTSQuerySign(ex);

    if ((sq & se) != se)
    {
        PG_FREE_IF_COPY(query, 0);
        PG_FREE_IF_COPY(ex, 1);

        PG_RETURN_BOOL(false);
    }

    iq = GETQUERY(query);
    ie = GETQUERY(ex);

    for (i = 0; i < ex->size; i++)
    {
        if (ie[i].type != QI_VAL)
            continue;
        for (j = 0; j < query->size; j++)
        {
            if (iq[j].type == QI_VAL &&
                ie[i].qoperand.valcrc == iq[j].qoperand.valcrc)
                break;
        }
        if (j >= query->size)
        {
            PG_FREE_IF_COPY(query, 0);
            PG_FREE_IF_COPY(ex, 1);

            PG_RETURN_BOOL(false);
        }
    }

    PG_FREE_IF_COPY(query, 0);
    PG_FREE_IF_COPY(ex, 1);

    PG_RETURN_BOOL(true);
}

Datum tsquery_and ( PG_FUNCTION_ARGS   ) 
Datum tsquery_cmp ( PG_FUNCTION_ARGS   ) 
Datum tsquery_not ( PG_FUNCTION_ARGS   ) 

Definition at line 109 of file tsquery_op.c.

References QTNode::child, QTNode::flags, GETOPERAND, GETQUERY, QTNode::nchild, QueryOperator::oper, palloc0(), PG_FREE_IF_COPY, PG_GETARG_TSQUERY_COPY, PG_RETURN_POINTER, QueryItem::qoperator, QT2QTN(), QTN2QT(), QTNFree(), TSQueryData::size, QueryItem::type, and QTNode::valnode.

{
    TSQuery     a = PG_GETARG_TSQUERY_COPY(0);
    QTNode     *res;
    TSQuery     query;

    if (a->size == 0)
        PG_RETURN_POINTER(a);

    res = (QTNode *) palloc0(sizeof(QTNode));

    res->flags |= QTN_NEEDFREE;

    res->valnode = (QueryItem *) palloc0(sizeof(QueryItem));
    res->valnode->type = QI_OPR;
    res->valnode->qoperator.oper = OP_NOT;

    res->child = (QTNode **) palloc0(sizeof(QTNode *));
    res->child[0] = QT2QTN(GETQUERY(a), GETOPERAND(a));
    res->nchild = 1;

    query = QTN2QT(res);

    QTNFree(res);
    PG_FREE_IF_COPY(a, 0);

    PG_RETURN_POINTER(query);
}

Datum tsquery_numnode ( PG_FUNCTION_ARGS   ) 

Definition at line 20 of file tsquery_op.c.

References PG_FREE_IF_COPY, PG_GETARG_TSQUERY, PG_RETURN_INT32, and TSQueryData::size.

{
    TSQuery     query = PG_GETARG_TSQUERY(0);
    int         nnode = query->size;

    PG_FREE_IF_COPY(query, 0);
    PG_RETURN_INT32(nnode);
}

Datum tsquery_or ( PG_FUNCTION_ARGS   ) 

Definition at line 79 of file tsquery_op.c.

References join_tsqueries(), OP_OR, PG_FREE_IF_COPY, PG_GETARG_TSQUERY_COPY, PG_RETURN_POINTER, QTN2QT(), QTNFree(), and TSQueryData::size.

{
    TSQuery     a = PG_GETARG_TSQUERY_COPY(0);
    TSQuery     b = PG_GETARG_TSQUERY_COPY(1);
    QTNode     *res;
    TSQuery     query;

    if (a->size == 0)
    {
        PG_FREE_IF_COPY(a, 1);
        PG_RETURN_POINTER(b);
    }
    else if (b->size == 0)
    {
        PG_FREE_IF_COPY(b, 1);
        PG_RETURN_POINTER(a);
    }

    res = join_tsqueries(a, b, OP_OR);

    query = QTN2QT(res);

    QTNFree(res);
    PG_FREE_IF_COPY(a, 0);
    PG_FREE_IF_COPY(b, 1);

    PG_RETURN_POINTER(query);
}