Package com.google.appengine.api.datastore.Query

Examples of com.google.appengine.api.datastore.Query.FilterOperator


      if(QueryFilterSimple.class.isAssignableFrom(filter.getClass())){
        QueryFilterSimple qf = (QueryFilterSimple)filter;
        Field f = qf.field;
        String propertyName = ClassInfo.getColumnNames(f)[0];
        Object value = qf.value;
        FilterOperator op = operators.get(qf.operator);
       
        // IN and NOT_EQUAL doesn't allow to use cursors
        if(op == FilterOperator.IN || op == FilterOperator.NOT_EQUAL){
          QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext)query.option(QueryOptionGaeContext.ID);
          if(gaeCtx==null){
            gaeCtx = new QueryOptionGaeContext();
            query.options().put(gaeCtx.type, gaeCtx);
          }
          gaeCtx.useCursor = false;
          query.option(QueryOptionOffset.ID).activate();         
        }
       
        if (value != null && ClassInfo.isModel(value.getClass())) {
          Key key = GaeMappingUtils.getKey(value);
          q.addFilter(propertyName, op, key);
        } else {
          if (ClassInfo.isId(f)) {
            Id id = f.getAnnotation(Id.class);
            switch(id.value()) {
            case NONE:
              if(value != null){
                if(!Collection.class.isAssignableFrom(value.getClass())){
                  // long or string goes toString
                  Key key;
                  if(parentKey == null){
                    key = KeyFactory.createKey(
                      q.getKind(),
                      value.toString());
                  }else {
                    key = KeyFactory.createKey(
                        parentKey,
                        q.getKind(),
                        value.toString());
                  }
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                }else {
                  List<Key> keys = new ArrayList<Key>();
                  for(Object val: (Collection<?>)value) {
                    if(parentKey == null){
                      keys.add(KeyFactory.createKey(q.getKind(), val.toString()));
                    }else {
                      keys.add(KeyFactory.createKey(parentKey, q.getKind(), val.toString()));
                    }
                  }
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                }
              }
              break;
            case AUTO_INCREMENT:
              if(value != null){
                if(!Collection.class.isAssignableFrom(value.getClass())){
                  Key key;
                  Class<?> type = f.getType();
 
                  if(Long.TYPE == type || Long.class.isAssignableFrom(type)){
                    if(parentKey == null){
                      key = KeyFactory.createKey(
                          q.getKind(),
                          (Long)value);
                    }else {
                      key = KeyFactory.createKey(
                          parentKey,
                          q.getKind(),
                          (Long)value);
                    }
                  } else {
                    if(parentKey == null){
                      key = KeyFactory.createKey(
                        q.getKind(),
                        value.toString());
                    }else {
                      key = KeyFactory.createKey(
                          parentKey,
                          q.getKind(),
                          value.toString());
                    }
                  }
                 
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                }else {
                  List<Key> keys = new ArrayList<Key>();
                  for(Object val: (Collection<?>)value) {
                    if (value instanceof String)
                      val = Long.parseLong((String) val);
                    if(parentKey == null){
                      keys.add(KeyFactory.createKey(q.getKind(), (Long)val));
                    }else {
                      keys.add(KeyFactory.createKey(parentKey, q.getKind(), (Long)val));
                    }
                  }
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                }
              }
              break;
            case UUID:
              if(value != null) {
                if(!Collection.class.isAssignableFrom(value.getClass())){
                  // long or string goes toString
                  Key key;
                  if(parentKey == null){
                    key = KeyFactory.createKey(
                        q.getKind(),
                        value.toString());
                  }else {
                    key = KeyFactory.createKey(
                        parentKey,
                        q.getKind(),
                        value.toString());
                  }
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, key);
                }else {
                  List<Key> keys = new ArrayList<Key>();
                  for(Object val: (Collection<?>)value) {
                    keys.add(KeyFactory.createKey(q.getKind(), val.toString()));
                  }
                  q.addFilter(Entity.KEY_RESERVED_PROPERTY, op, keys);
                }
              }
              break;
            default:
              throw new SienaException("Id Generator "+id.value()+ " not supported");
            }
   
          } else if (Enum.class.isAssignableFrom(f.getType())) {
            value = value.toString();
            q.addFilter(propertyName, op, value);
          } else {
            q.addFilter(propertyName, op, value);
          }
        }
      }else if(QueryFilterSearch.class.isAssignableFrom(filter.getClass())){
        Class<T> clazz = query.getQueriedClass();
        QueryFilterSearch qf = (QueryFilterSearch)filter;
        if(qf.fields.length>1)
          throw new SienaException("Search not possible for several fields in GAE: only one field");
        try {
          Field field = Util.getField(clazz, qf.fields[0]);
          if(field.isAnnotationPresent(Unindexed.class)){
            throw new SienaException("Cannot search the @Unindexed field "+field.getName());
          }
         
          // cuts match into words
          String[] words = qf.match.split("\\s");
         
          // if several words, then only OR operator represented by IN GAE
          Pattern pNormal = Pattern.compile("[^\\*](\\w+)[^\\*]");
          if(words.length>1){
            for(String word:words){
              if(!pNormal.matcher(word).matches()){
                throw new SienaException("Cannot do a multiwords search with the * operator");
              }
            }
            List<String> wordList = new ArrayList<String>();
            Collections.addAll(wordList, words);
            addSearchFilterIn(q, field, wordList);
          }else {
            // searches for pattern such as "alpha*" or "*alpha" or "alpha"
            Pattern pStart = Pattern.compile("(\\w+)\\*");
   
            String word = words[0];
            Matcher matcher = pStart.matcher(word);
            if(matcher.matches()){
              String realWord = matcher.group(1);
              addSearchFilterBeginsWith(q, field, realWord);
              continue;
            }
           
            matcher = pNormal.matcher(word);
            if(matcher.matches()){
              addSearchFilterEquals(q, field, word);
              continue;
            }
           
            Pattern pEnd = Pattern.compile("\\*(\\w+)");
            matcher = pEnd.matcher(word);
            if(matcher.matches()){
              throw new SienaException("Cannot do a \"*word\" search in GAE");
            }            
          }         
        }catch(Exception e){
          throw new SienaException(e);
        }
        break;
      }else if(QueryFilterEmbedded.class.isAssignableFrom(filter.getClass())){
        QueryFilterEmbedded qf = (QueryFilterEmbedded)filter;
       
        String propName = "";
        int sz = qf.fields.size();
        for(int i=0; i<sz; i++){
          propName += ClassInfo.getSingleColumnName(qf.fields.get(i));
          if(i < sz-1){
            propName += qf.fieldSeparator;
          }
        }
       
        Object value = qf.value;
        FilterOperator op = operators.get(qf.operator);
       
        // IN and NOT_EQUAL doesn't allow to use cursors
        if(op == FilterOperator.IN || op == FilterOperator.NOT_EQUAL){
          QueryOptionGaeContext gaeCtx = (QueryOptionGaeContext)query.option(QueryOptionGaeContext.ID);
          if(gaeCtx==null){
            gaeCtx = new QueryOptionGaeContext();
            query.options().put(gaeCtx.type, gaeCtx);
          }
          gaeCtx.useCursor = false;
          query.option(QueryOptionOffset.ID).activate();         
        }
       
        q.addFilter(propName, op, value);
      }
    }
   
    // adds filter on owners
    List<QueryOwned> ownees = query.getOwnees();
    for (QueryOwned ownee : ownees) {
      String propertyName = ClassInfo.getSimplestColumnName(ownee.field);
      FilterOperator op = operators.get("=");
      Key key = GaeMappingUtils.getKey(ownee.owner);
      q.addFilter(propertyName, op, key);
    }
   
    List<QueryOrder> orders = query.getOrders();
View Full Code Here


      }

      @Override
      public Find<T> filter(String field, Find.Op op, Object value)
      {
        FilterOperator gop;
        switch (op)
        {
          case LessThan :
            gop = FilterOperator.LESS_THAN;
            break;
View Full Code Here

      int opIndex = -1;
      for (String op : OPERATORS) {
        opIndex = filter.indexOf(op);
        if (opIndex != -1) {
          String propName = filter.substring(0, opIndex);
          FilterOperator operator = OPERATOR_MAP.get(op);
          String propValue = filter.substring(opIndex + op.length());
          propValue = parseValue(propValue);

          // special case: year has int value
          if (propName.equals("year")) {
View Full Code Here

    return requestBldr;
  }

  private static PropertyFilter.Builder toV4PropertyFilter(Query.FilterPredicate predicate) {
    PropertyFilter.Builder filter = PropertyFilter.newBuilder();
    FilterOperator operator = predicate.getOperator();
    Object value = predicate.getValue();
    if (operator == Query.FilterOperator.IN) {
      if (!(predicate.getValue() instanceof Collection<?>)) {
        throw new IllegalArgumentException("IN filter value is not a Collection.");
      }
View Full Code Here

    String[] parts = condition.trim().split(" ");
    if (parts.length < 1 || parts.length > 2)
      throw new IllegalArgumentException("'" + condition + "' is not a legal filter condition");

    String prop = parts[0].trim();
    FilterOperator op = (parts.length == 2) ? this.translate(parts[1]) : FilterOperator.EQUAL;

    // If we have a class restriction, check to see if the property is the @Parent or @Id. We used to try to convert
    // filtering on the id field to a __key__ query, but that tended to confuse users about the real capabilities
    // of GAE and Objectify. So let's force users to use filterKey() instead.
    if (this.classRestriction != null) {
      KeyMetadata<?> meta = loader.ofy.factory().keys().getMetadataSafe(this.classRestriction);

      if (prop.equals(meta.getParentFieldName())) {
        throw new IllegalArgumentException("@Parent fields cannot be filtered on. Perhaps you wish to use filterKey() or ancestor() instead?");
      }
      else if (prop.equals(meta.getIdFieldName())) {
        throw new IllegalArgumentException("@Id fields cannot be filtered on. Perhaps you wish to use filterKey() instead?");
      }
    }

    // Convert to something filterable, possibly extracting/converting keys
    value = loader.getObjectifyImpl().makeFilterable(value);

    addFilter(op.of(prop, value));

    if (op == FilterOperator.IN || op == FilterOperator.NOT_EQUAL)
      hasMulti = true;
  }
View Full Code Here

TOP

Related Classes of com.google.appengine.api.datastore.Query.FilterOperator

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.