Resources STLRepository::fields( const Resources& values, const shared_ptr< Query >& query ) { if ( not query->has_fields( ) ) { return values; } Resources results = values; set< string > fields = query->get_fields( ); for ( auto result = results.begin( ); result not_eq results.end( ); ) { for ( auto property = result->begin( ); property not_eq result->end( ); ) { if ( fields.count( property->first ) == 0 ) { result->erase( property++ ); } else { ++property; } } if ( result->empty( ) ) { result = results.erase( result ); } else { result++; } } return results; }
void STLRepository::filter( Resources& resources, const multimap< string, Bytes >& inclusive_filters, const multimap< string, Bytes >& exclusive_filters ) const { for ( auto resource = resources.begin( ); resource not_eq resources.end( ); ) { bool failed = true; for ( const auto filter : exclusive_filters ) { failed = true; const auto properties = resource->equal_range( filter.first ); for ( auto property = properties.first; property not_eq properties.second; property++ ) { if ( property->second == filter.second ) { failed = false; break; } } if ( failed ) { break; } } if ( failed and not exclusive_filters.empty( ) ) { resource = resources.erase( resource ); continue; } if ( inclusive_filters.empty( ) ) { resource++; continue; } failed = true; for ( auto filter_iterator = inclusive_filters.begin( ); filter_iterator not_eq inclusive_filters.end( ); filter_iterator++ ) { failed = true; const auto properties = resource->equal_range( filter_iterator->first ); const auto filters = inclusive_filters.equal_range( filter_iterator->first ); for ( auto filter = filters.first; filter not_eq filters.second; filter++ ) { for ( auto property = properties.first; property not_eq properties.second; property++ ) { if ( property->second == filter->second ) { failed = false; break; } } if ( not failed ) { break; } } if ( failed ) { break; } if ( filters.second not_eq inclusive_filters.end( ) ) { filter_iterator = filters.second; } } if ( failed ) { resource = resources.erase( resource ); } else { resource++; } } }