Example #1
0
   static INT32 getCondAttrMoreFields( qgmConditionNode *condNode,
                                       const qgmOPFieldVec &fields,
                                       qgmOPFieldVec &more )
   {
      if ( 0 == fields.size() )
      {
         return SDB_OK ;
      }

      qgmConditionNodeHelper condTree( condNode ) ;
      qgmDbAttrPtrVec attrs ;
      condTree.getAllAttr( attrs ) ;
      qgmDbAttrPtrVec::iterator it = attrs.begin() ;
      while ( it != attrs.end() )
      {
         if ( isFromOne( *(*it), more, FALSE ) )
         {
            ++it ;
            continue ;
         }

         if ( !isFromOne( *(*it), fields, TRUE ) )
         {
            more.push_back( qgmOpField( *(*it), SQL_GRAMMAR::DBATTR ) ) ;
         }
         ++it ;
      }
      return SDB_OK ;
   }
   INT32 _qgmOptiAggregation::_addFields( qgmOprUnit * oprUnit )
   {
      PD_TRACE_ENTRY( SDB__QGMOPTIAGGREGATION__ADDFIELDS ) ;
      INT32 rc = SDB_OK ;
      if ( QGM_OPTI_TYPE_FILTER != oprUnit->getType() )
      {
         return SDB_INVALIDARG ;
      }

      qgmOPFieldVec notAggrFields ;
      qgmAggrSelectorVec::iterator it = _selector.begin() ;
      while ( it != _selector.end() )
      {
         qgmOpField &field = (*it).value ;
         if ( SQL_GRAMMAR::FUNC != field.type )
         {
            notAggrFields.push_back( field ) ;
         }
         ++it ;
      }

      oprUnit->getFields()->clear() ;
      it = _selector.begin() ;
      while ( it != _selector.end() )
      {
         qgmAggrSelector &select = *it ;
         if ( select.value.type != SQL_GRAMMAR::FUNC )
         {
            oprUnit->addOpField( select.value, QGM_OPR_FILTER_COPY_FLAG ) ;
         }
         else if ( select.value.type != SQL_GRAMMAR::WILDCARD )
         {
            vector<qgmOpField>::iterator itAttr = select.param.begin() ;
            while ( itAttr != select.param.end() )
            {
               qgmDbAttr &attr = itAttr->value ;
               if ( !isFromOne( attr, notAggrFields, FALSE ) )
               {
                  oprUnit->addOpField( qgmOpField( attr, SQL_GRAMMAR::DBATTR ),
                                       TRUE ) ;
               }
               ++itAttr ;
            }
         }
         ++it ;
      }

      if ( !oprUnit->isWildCardField() && oprUnit->getFields()->size() > 0 )
      {
         oprUnit->addOpField( _groupby, TRUE ) ;
      }

      PD_TRACE_EXITRC( SDB__QGMOPTIAGGREGATION__ADDFIELDS, rc ) ;
      return rc ;
   }
Example #3
0
INT32 _qgmOptiNLJoin::_pushOprUnit( qgmOprUnit * oprUnit, PUSH_FROM from )
{
    PD_TRACE_ENTRY( SDB__QGMOPTINLJOIN__PUSHOPRUNIT ) ;
    INT32 rc = SDB_OK ;
    qgmFilterUnit *filterUnit = NULL ;
    qgmFilterUnit *outerUnit = NULL ;
    qgmFilterUnit *innerUnit = NULL ;

    if ( needMakeCondition() )
    {
        rc = makeCondition() ;
        if ( SDB_OK != rc )
        {
            PD_LOG( PDERROR, "Node[%s] make condition failed, rc: %d",
                    toString().c_str(), rc ) ;
            goto error ;
        }
    }

    if ( QGM_OPTI_TYPE_SORT == oprUnit->getType() )
    {
        oprUnit->setDispatchAlias( outer()->getAlias( TRUE ) ) ;
        oprUnit->resetNodeID() ;
        _oprUnits.insert( _oprUnits.begin(), oprUnit ) ;
        _hasPushSort = TRUE ;
    }
    else if ( QGM_OPTI_TYPE_FILTER == oprUnit->getType() )
    {
        qgmConditionNodePtrVec conds ;
        qgmConditionNodePtrVec::iterator itCond ;
        BOOLEAN outerChange = FALSE ;
        BOOLEAN innerChange = FALSE ;

        outerUnit = SDB_OSS_NEW qgmFilterUnit( QGM_OPTI_TYPE_FILTER ) ;
        innerUnit = SDB_OSS_NEW qgmFilterUnit( QGM_OPTI_TYPE_FILTER ) ;
        if ( !outerUnit || !innerUnit )
        {
            rc = SDB_OOM ;
            goto error ;
        }
        outerUnit->setOptional( TRUE ) ;
        innerUnit->setOptional( TRUE ) ;

        filterUnit = (qgmFilterUnit*)oprUnit ;
        qgmOPFieldVec *fields = filterUnit->getFields() ;
        for ( UINT32 index = 0 ; index < fields->size() ; index++ )
        {
            qgmOpField &field = (*fields)[index] ;
            if ( field.value.relegation() == outer()->getAlias( TRUE ) )
            {
                outerUnit->addOpField( field ) ;
                outerChange = TRUE ;
            }
            else if ( field.value.relegation() == inner()->getAlias( TRUE ) )
            {
                innerUnit->addOpField( field ) ;
                innerChange = TRUE ;
            }
            else
            {
                PD_LOG_MSG( PDERROR,
                            "oprUnit[%s] field[%s] is not in outer[%s] or "
                            "inner[%s]", oprUnit->toString().c_str(),
                            field.toString().c_str(),
                            outer()->getAlias( TRUE ).toString().c_str(),
                            inner()->getAlias( TRUE ).toString().c_str() ) ;
                rc = SDB_INVALIDARG ;
                goto error ;
            }
        }

        conds = filterUnit->getConditions() ;
        itCond = conds.begin() ;
        while ( itCond != conds.end() )
        {
            qgmConditionNode *condNode = *itCond ;
            while ( condNode->left )
            {
                condNode = condNode->left ;
            }

            if ( condNode->type != SQL_GRAMMAR::DBATTR )
            {
                outerUnit->addCondition( *itCond ) ;
                innerUnit->addCondition( SDB_OSS_NEW qgmConditionNode( *itCond ) ) ;
                outerChange = TRUE ;
                innerChange = TRUE ;
            }
            else if ( condNode->value.relegation() == outer()->getAlias( TRUE ) )
            {
                outerUnit->addCondition( *itCond ) ;
                outerChange = TRUE ;
            }
            else if ( condNode->value.relegation() == inner()->getAlias( TRUE ) )
            {
                innerUnit->addCondition( *itCond ) ;
                innerChange = TRUE ;
            }
            else
            {
                PD_LOG_MSG( PDERROR,
                            "oprUnit[%s] condition attr[%s] is not in "
                            "outer[%s] or inner[%s]", oprUnit->toString().c_str(),
                            condNode->value.toString().c_str(),
                            outer()->getAlias( TRUE ).toString().c_str(),
                            inner()->getAlias( TRUE ).toString().c_str() ) ;
                rc = SDB_INVALIDARG ;
                goto error ;
            }

            ++itCond ;
        }

        if ( !outerChange && _varList.size() == 0 )
        {
            qgmOpField dummyField ;
            dummyField.value.relegation() = outer()->getAlias( TRUE ) ;
            _table->getUniqueFieldAlias( dummyField.value.attr() ) ;
            dummyField.type = SQL_GRAMMAR::DBATTR ;
            outerUnit->addOpField( dummyField ) ;
        }

        QGM_VARLIST::iterator itVar = _varList.begin() ;
        while ( itVar != _varList.end() )
        {
            if ( !isFromOne( (*itVar)._fieldName, *(outerUnit->getFields()),
                             FALSE ) &&
                    ((*itVar)._fieldName.relegation() ==
                     outer()->getAlias()) )
            {
                outerUnit->addOpField( qgmOpField( (*itVar)._fieldName,
                                                   SQL_GRAMMAR::DBATTR) ) ;
            }
            ++itVar ;
        }

        if ( !_hints.empty() )
        {
            SDB_ASSERT( _varList.empty(), "must be empty" ) ;
            _qgmConditionNodeHelper ctree( _condition ) ;
            qgmDbAttrPtrVec attrVec ;
            rc = ctree.getAllAttr( attrVec ) ;
            if ( SDB_OK != rc )
            {
                PD_LOG( PDERROR, "failed to get all attrs from condition tree:%d", rc ) ;
                goto error ;
            }

            qgmDbAttrPtrVec::const_iterator itr = attrVec.begin() ;
            for ( ; itr != attrVec.end(); itr++ )
            {
                if ( !isFromOne( **itr, *(outerUnit->getFields()),
                                 FALSE ) &&
                        ((*itr)->relegation() ==
                         outer()->getAlias()) )
                {
                    outerUnit->addOpField( qgmOpField( **itr,
                                                       SQL_GRAMMAR::DBATTR) ) ;
                }
                else if ( !isFromOne( **itr, *(innerUnit->getFields()),
                                      FALSE ) &&
                          ((*itr)->relegation() ==
                           inner()->getAlias()))
                {
                    innerUnit->addOpField( qgmOpField(**itr,
                                                      SQL_GRAMMAR::DBATTR) ) ;
                }
            }
        }

        outerUnit->setDispatchAlias( outer()->getAlias( TRUE ) ) ;
        _oprUnits.push_back( outerUnit ) ;
        outerUnit = NULL ;

        if ( !innerChange )
        {
            qgmOpField dummyField ;
            dummyField.value.relegation() = inner()->getAlias( TRUE ) ;
            _table->getUniqueFieldAlias( dummyField.value.attr() ) ;
            dummyField.type = SQL_GRAMMAR::DBATTR ;
            innerUnit->addOpField( dummyField ) ;
        }

        innerUnit->setDispatchAlias( inner()->getAlias( TRUE ) ) ;
        _oprUnits.push_back( innerUnit ) ;
        innerUnit = NULL ;

        filterUnit->emptyCondition() ;
        SDB_OSS_DEL filterUnit ;
    }
    else
    {
        rc = SDB_SYS ;
        goto error ;
    }

done:
    PD_TRACE_EXITRC( SDB__QGMOPTINLJOIN__PUSHOPRUNIT, rc ) ;
    return rc ;
error:
    if ( outerUnit )
    {
        SDB_OSS_DEL outerUnit ;
    }
    if ( innerUnit )
    {
        SDB_OSS_DEL innerUnit ;
    }
    goto done ;
}
Example #4
0
   INT32 _optQgmFilterFilterSty::calcResult( qgmOprUnit * oprUnit,
                                             qgmOptiTreeNode * curNode,
                                             qgmOptiTreeNode * subNode,
                                             OPT_QGM_SS_RESULT & result )
   {
      qgmOptiSelect *filter = (qgmOptiSelect*)subNode ;
      qgmFilterUnit *filterUnit = (qgmFilterUnit*)oprUnit ;
      qgmFilterUnit *newCopy = NULL ;
      INT32 rc = SDB_OK ;

      if ( filter->hasConstraint() && FILTER_SEC != filterUnit->filterType() )
      {
         result = OPT_SS_REFUSE ;

         qgmOPFieldVec *fields = filterUnit->getFields() ;

         if ( fields->size() > 0 && !oprUnit->isWildCardField() )
         {
            qgmDbAttrPtrVec attrs ;
            qgmDbAttrPtrVec::iterator itAttr ;

            newCopy = SDB_OSS_NEW qgmFilterUnit( *filterUnit,
             filterUnit->isFieldsOptional() ? FALSE : QGM_OPR_FILTER_COPY_FLAG ) ;
            if ( !newCopy )
            {
               rc = SDB_OOM ;
               goto error ;
            }

            filterUnit->getCondFields( attrs ) ;
            itAttr = attrs.begin() ;
            while ( itAttr != attrs.end() )
            {
               newCopy->addOpField( qgmOpField( *(*itAttr), SQL_GRAMMAR::DBATTR ),
                                    TRUE ) ;
               ++itAttr ;
            }

            rc = subNode->pushOprUnit( newCopy, curNode,
                                       qgmOptiTreeNode::FROM_UP ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "push oprUnit[%s] to subNode[%s] from node[%s] "
                       "failed, rc: %d", newCopy->toString().c_str(),
                       subNode->toString().c_str(), rc ) ;
               goto error ;
            }
         }
      }
      else
      {
         result = OPT_SS_ACCEPT ;
      }

   done:
      return rc ;
   error:
      if ( newCopy )
      {
         SDB_OSS_DEL newCopy ;
      }
      goto done ;
   }
Example #5
0
INT32 _qgmOptiNLJoin::_createJoinUnit()
{
    PD_TRACE_ENTRY( SDB__QGMOPTINLJOIN__CRTJOINUNIT ) ;
    INT32 rc = SDB_OK ;
    qgmOprUnit *joinUnit = NULL ;
    QGM_VARLIST::iterator it ;

    if ( _hints.empty() )
    {
        if ( 0 == _varList.size() )
        {
            goto done ;
        }

        joinUnit = SDB_OSS_NEW qgmOprUnit( QGM_OPTI_TYPE_JOIN ) ;
        if ( !joinUnit )
        {
            rc = SDB_OOM ;
            goto error ;
        }

        it = _varList.begin() ;
        while ( it != _varList.end() )
        {
            qgmDbAttr &fieldName = (*it)._fieldName ;
            joinUnit->addOpField( qgmOpField( fieldName, SQL_GRAMMAR::DBATTR ),
                                  FALSE ) ;
            ++it ;
        }
        joinUnit->setDispatchAlias( outer()->getAlias(TRUE) ) ;
        _oprUnits.push_back( joinUnit ) ;
        joinUnit = NULL ;
    }
    else
    {
        SDB_ASSERT( NULL != _condition &&
                    NULL != _condition->left &&
                    NULL != _condition->right, "can not be NULL") ;
        SDB_ASSERT( SQL_GRAMMAR::DBATTR == _condition->left->type &&
                    SQL_GRAMMAR::DBATTR == _condition->right->type,
                    "impossible" ) ;

        joinUnit = SDB_OSS_NEW qgmOprUnit( QGM_OPTI_TYPE_JOIN ) ;
        if ( !joinUnit )
        {
            rc = SDB_OOM ;
            goto error ;
        }
        joinUnit->setDispatchAlias( outer()->getAlias(TRUE) ) ;
        joinUnit->addOpField( qgmOpField(_condition->right->value,
                                         SQL_GRAMMAR::DBATTR),
                              FALSE) ;
        _oprUnits.push_back( joinUnit ) ;
        joinUnit = NULL ;

        joinUnit = SDB_OSS_NEW qgmOprUnit( QGM_OPTI_TYPE_JOIN_CONDITION ) ;
        if ( !joinUnit )
        {
            rc = SDB_OOM ;
            goto error ;
        }
        joinUnit->setDispatchAlias( inner()->getAlias(TRUE) ) ;
        joinUnit->addOpField( qgmOpField(_condition->left->value,
                                         SQL_GRAMMAR::DBATTR),
                              FALSE) ;
        _oprUnits.push_back( joinUnit ) ;
        joinUnit = NULL ;
    }


done:
    PD_TRACE_EXITRC( SDB__QGMOPTINLJOIN__CRTJOINUNIT, rc ) ;
    return rc ;
error:
    if ( joinUnit )
    {
        SDB_OSS_DEL joinUnit ;
    }
    goto done ;
}