All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.code.morphia.query.CriteriaContainerImpl Maven / Gradle / Ivy

package com.google.code.morphia.query;


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;


public class CriteriaContainerImpl extends AbstractCriteria implements CriteriaContainer {
  protected final CriteriaJoin   joinMethod;
  protected List children;

  protected QueryImpl query;

  protected CriteriaContainerImpl(final CriteriaJoin joinMethod) {
    this.joinMethod = joinMethod;
    children = new ArrayList();
  }

  protected CriteriaContainerImpl(final QueryImpl query, final CriteriaJoin joinMethod) {
    this(joinMethod);
    this.query = query;
  }

  public void add(final Criteria... criteria) {
    for (final Criteria c : criteria) {
      c.attach(this);
      children.add(c);
    }
  }

  public void remove(final Criteria criteria) {
    children.remove(criteria);
  }

  public void addTo(final DBObject obj) {
    if (joinMethod == CriteriaJoin.AND) {
      final Set fields = new HashSet();
      int nonNullFieldNames = 0;
      for (final Criteria child : children) {
        if (null != child.getFieldName()) {
          fields.add(child.getFieldName());
          nonNullFieldNames++;
        }
      }
      if (fields.size() < nonNullFieldNames) {
        //use $and
        final BasicDBList and = new BasicDBList();

        for (final Criteria child : children) {
          final BasicDBObject container = new BasicDBObject();
          child.addTo(container);
          and.add(container);
        }

        obj.put("$and", and);
      } else {
        //no dup field names, don't use $and
        for (final Criteria child : children) {
          child.addTo(obj);
        }
      }
    } else if (joinMethod == CriteriaJoin.OR) {
      final BasicDBList or = new BasicDBList();

      for (final Criteria child : children) {
        final BasicDBObject container = new BasicDBObject();
        child.addTo(container);
        or.add(container);
      }

      obj.put("$or", or);
    }
  }

  public CriteriaContainer and(final Criteria... criteria) {
    return collect(CriteriaJoin.AND, criteria);
  }

  public CriteriaContainer or(final Criteria... criteria) {
    return collect(CriteriaJoin.OR, criteria);
  }

  private CriteriaContainer collect(final CriteriaJoin cj, final Criteria... criteria) {
    final CriteriaContainerImpl parent = new CriteriaContainerImpl(query, cj);

    for (final Criteria c : criteria) {
      parent.add(c);
    }

    add(parent);

    return parent;
  }

  public FieldEnd criteria(final String name) {
    return criteria(name, query.isValidatingNames());
  }

  private FieldEnd criteria(final String field, final boolean validateName) {
    return new FieldEndImpl(query, field, this, validateName);
  }

  public String getFieldName() {
    return joinMethod.toString();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy