protected EOQualifier extraQualifier(D2WContext c, NSDictionary<String, Object> dict) {
   NSMutableArray<EOQualifier> qualifiers = new NSMutableArray<>();
   EOQualifier result = null;
   for (String key : dict.allKeys()) {
     Object value = null;
     if (dict.objectForKey(key) instanceof NSDictionary) {
       // qualifier definition with operator
       NSDictionary qDict = (NSDictionary) dict.objectForKey(key);
       if (qDict.size() == 1) {
         String operatorKey = (String) qDict.allKeys().lastObject();
         String contextKeyPath = (String) qDict.objectForKey(operatorKey);
         if ("NSKeyValueCoding.NullValue".equals(contextKeyPath)) {
           value = NSKeyValueCoding.NullValue;
         } else {
           value = c.valueForKeyPath(contextKeyPath);
         }
         if (value != null) {
           EOQualifier q = qualifierForOperatorAndObject(key, operatorKey, value);
           qualifiers.addObject(q);
         }
       }
     } else {
       value = c.valueForKeyPath((String) dict.objectForKey(key));
       if (value != null) {
         EOQualifier q;
         if (value instanceof NSArray) {
           q = qualifierForArray(key, (NSArray) value);
         } else {
           if (value == NSKeyValueCoding.NullValue) {
             value = null;
           }
           q = qualifierForObject(key, value);
         }
         if (q != null) {
           qualifiers.addObject(q);
         }
       }
     }
   }
   if (qualifiers.count() > 0) result = new EOAndQualifier(qualifiers);
   if (log.isDebugEnabled()) {
     log.debug("Computed qualifier: " + result);
   }
   return result;
 }