protected function _processCriteria(Criteria $criteria)
 {
     $map = array(Criteria\Type::ID => 'id', Criteria\Type::ICC => 'icc', Criteria\Type::IMSI => 'imsi', Criteria\Type::MSISDN => 'msisdn', Criteria\Type::ALIAS => 'alias', Criteria\Type::CUSTOM_FIELD_1 => 'custom_field_1', Criteria\Type::CUSTOM_FIELD_2 => 'custom_field_2', Criteria\Type::CUSTOM_FIELD_3 => 'custom_field_3', Criteria\Type::CUSTOM_FIELD_4 => 'custom_field_4', Criteria\Type::SIM_TYPE => 'sim_type', Criteria\Type::LIFE_CYCLE_STATE => 'life_cycle_state', Criteria\Type::PROVISION_DATE => 'provision_date', Criteria\Type::SHIPPING_DATE => 'shipping_date', Criteria\Type::ACTIVATION_DATE => 'activation_date', Criteria\Type::SERVICE_PROVIDER_ENABLER => 'service_provider_enabler', Criteria\Type::SERVICE_PROVIDER_COMM => 'service_provider_commercial', Criteria\Type::CUSTOMER => 'customer', Criteria\Type::AGGREGATOR => 'aggregator', Criteria\Type::END_USER => 'end_user', Criteria\Type::COMMERCIAL_GROUP => 'commercial_group', Criteria\Type::SUPERVISION_GROUP => 'supervision_group', Criteria\Type::BILLING_ACCOUNT => 'billing_account', Criteria\Type::ORDER_NUMBER => 'order_number', Criteria\Type::IMEI => 'imei', Criteria\Type::IMEI_CHANGE_DATE => 'imei_change_date', Criteria\Type::COMMUNICATION_MODULE_MANUFACTURER => 'communication_module_manufacturer', Criteria\Type::COMMUNICATION_MODULE_MODEL => 'communication_module_model', Criteria\Type::STATIC_IP => 'static_ip', Criteria\Type::STATIC_IP_RANGE => 'static_ip_range', Criteria\Type::CURRENT_IP => 'current_ip', Criteria\Type::CURRENT_IP_RANGE => 'current_ip_range', Criteria\Type::APN => 'apn', Criteria\Type::SERVICE_PACK => 'service_pack', Criteria\Type::EXPENSE => 'expense', Criteria\Type::CONSUMPTION => 'consumption', Criteria\Type::PRESENCE => 'presence', Criteria\Type::LOCATION => 'location', Criteria\Type::ALARM => 'alarm', Criteria\Type::LTE_ENABLED => 'lte_enabled', Criteria\Type::SUPPLEMENTARY_SERVICES => 'suppl_service');
     $descriptors = Criteria::descriptor();
     $fieldName = $map[$criteria->getType()];
     $fieldDesc = $descriptors->getFieldByName($fieldName);
     if (!$fieldDesc) {
         return;
     }
     switch ($criteria->getType()) {
         case Criteria\Type::SERVICE_PROVIDER_ENABLER:
         case Criteria\Type::SERVICE_PROVIDER_COMM:
         case Criteria\Type::AGGREGATOR:
         case Criteria\Type::END_USER:
             $mongoField = $fieldName . '.id';
             break;
             // TODO: WOW... maybe it isn't id filter? Javi request this change for demo. We have to talk with
             // Ericsson, must they accept names instead of ids?
         // TODO: WOW... maybe it isn't id filter? Javi request this change for demo. We have to talk with
         // Ericsson, must they accept names instead of ids?
         case Criteria\Type::CUSTOMER:
             $mongoField = $fieldName . '.id';
             break;
         case Criteria\Type::ID:
             $mongoField = '_id';
             break;
         case Criteria\Type::SUPPLEMENTARY_SERVICES:
             switch ($criteria->{$fieldName}) {
                 case \Application\Proto\SubscriptionSupplServicesEnum::ADV_SUPERVISION:
                     $subfield = 'adv_supervision';
                     break;
                 case \Application\Proto\SubscriptionSupplServicesEnum::DCA:
                     $subfield = 'dca';
                     break;
                 case \Application\Proto\SubscriptionSupplServicesEnum::DIM:
                     $subfield = 'dim';
                     break;
                 case \Application\Proto\SubscriptionSupplServicesEnum::LOCATION:
                     $subfield = 'location';
                     break;
                 case \Application\Proto\SubscriptionSupplServicesEnum::VPN:
                     $subfield = 'vpn';
                     break;
             }
             $mongoField = 'supplementary_services.' . $subfield;
             break;
         default:
             $mongoField = $fieldName;
     }
     if ($fieldDesc->getType() === DrSlump\Protobuf::TYPE_MESSAGE) {
         switch ($fieldDesc->getReference()) {
             case '\\Application\\Proto\\DateInterval':
                 $value = array();
                 if ($criteria->{$fieldName}->start_date !== null) {
                     $value['$gte'] = $criteria->{$fieldName}->start_date;
                 }
                 if ($criteria->{$fieldName}->end_date !== null) {
                     $value['$lte'] = $criteria->{$fieldName}->end_date;
                 }
                 break;
         }
     } else {
         if ($criteria->getType() == Criteria\Type::SUPPLEMENTARY_SERVICES) {
             $value = 1;
         } else {
             $value = $criteria->{$fieldName};
         }
     }
     if (!isset($value)) {
         return;
     }
     return array($mongoField => $value);
 }