//------------------------------------------------------------------------------- Table::Ptr solveOptimalMinMax(aq::verb::VerbNode::Ptr spTree, Base& BaseDesc, Settings& Settings ) { if( !spTree->getLeftChild() ) { return NULL; // throw generic_error(generic_error::INVALID_QUERY, ""); } aq::verb::VerbNode::Ptr verb1 = spTree->getLeftChild(); aq::verb::VerbNode::Ptr verb2 = NULL; if( !verb1 ) return NULL; if ((verb1->getVerbType() == K_MIN) || (verb1->getVerbType() == K_MAX)) verb2 = verb1->getLeftChild(); else if ((verb1->getVerbType() == K_AS) && ((verb1->getLeftChild()->getVerbType() == K_MIN) || (verb1->getLeftChild()->getVerbType() == K_MAX))) verb2 = verb1->getLeftChild()->getLeftChild(); else return NULL; if( verb2->getVerbType() != K_PERIOD ) return NULL; if( spTree->getBrother() == NULL ) return NULL; aq::verb::VerbNode::Ptr spNode = spTree; do { if( spNode->getVerbType() == K_WHERE ) return NULL; spNode = spNode->getBrother(); } while( spNode->getBrother() ); aq::verb::ColumnVerb::Ptr columnVerb = boost::dynamic_pointer_cast<aq::verb::ColumnVerb>( verb2 ); Table::Ptr table = BaseDesc.getTable( columnVerb->getTableName() ); size_t colIdx = table->getColumnIdx( columnVerb->getColumnOnlyName() ); Column::Ptr column = table->Columns[colIdx]; ColumnItem::Ptr minMax = NULL; bool min = verb1->getVerbType() == K_MIN; for( int partIdx = 0; ; ++partIdx ) { ColumnItem::Ptr item = getMinMaxFromThesaurus( table->ID, colIdx, partIdx, min, BaseDesc, Settings ); if( !item ) break; if( !minMax ) minMax = item; else if( min == ColumnItem::lessThan(item.get(), minMax.get(), column->Type) ) minMax = item; } table.reset(new Table()); Column::Ptr newColumn(new Column(*column)); newColumn->Items.push_back( minMax ); table->Columns.push_back( newColumn ); table->TotalCount = 1; return table; }