// ** Films::similarTo SimilarFilmsArray Films::similarTo( const std::string& oid, int count ) const { SimilarFilmsArray result; OID objectId = OID( oid ); CollectionPtr similars = m_target->collection( "similar" ); CursorPtr cursor = similars->find( QUERY( "$or" << ARRAY( DOCUMENT( "first" << oid ) << DOCUMENT( "second" << objectId ) ) ) ); DocumentPtr document; while( (document = cursor->next()) ) { // ** Read data from document OID first = document->objectId( "first" ); OID second = document->objectId( "second" ); int value = document->integer( "value" ); // ** Decode similarity & accuracy float similarity, accuracy; decodeSimilarity( value, similarity, accuracy ); // ** Push similar film Film film = filmById( first == objectId ? second : first ); Quality quality = qualityFromRange( similarity, m_similarityQuartiles ); result.push_back( SimilarFilm( film, similarity, accuracy, quality ) ); } std::sort( result.begin(), result.end(), SimilarFilm::sortBySimilarity ); if( count ) { result.resize( std::min( count, ( int )result.size() ) ); } return result; }