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

org.immutables.fixture.SillyEntitySecondRepository Maven / Gradle / Ivy

package org.immutables.fixture;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import java.util.List;
import javax.annotation.CheckReturnValue;
import javax.annotation.Generated;
import javax.annotation.ParametersAreNonnullByDefault;
import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.NotThreadSafe;
import javax.annotation.concurrent.ThreadSafe;
import org.immutables.gson.adapter.FieldNamingTranslator;
import org.immutables.mongo.concurrent.FluentFuture;
import org.immutables.mongo.repository.Repositories;
import org.immutables.mongo.repository.RepositorySetup;
import org.immutables.mongo.repository.internal.Constraints;
import org.immutables.mongo.repository.internal.Support;
import org.immutables.mongo.types.Id;

/**
 * A {@code SillyEntitySecondRepository} provides type-safe access for storing and retrieving documents
 * from the MongoDB collection {@code "ent2"}.
 */
@SuppressWarnings("all")
@Generated({"Repositories.generator", "org.immutables.fixture.SillyEntitySecond"})
@ParametersAreNonnullByDefault
@ThreadSafe
public final class SillyEntitySecondRepository extends Repositories.Repository {
  private static final String DOCUMENT_COLLECTION_NAME = "ent2";

  private final Serialization serialization;
  private final Criteria anyCriteria;

  /**
   * Constructs a {@link SillyEntitySecond} repository using {@link RepositorySetup configuration}.
   * @param configuration The repository configuration
   */
  public SillyEntitySecondRepository(RepositorySetup configuration) {
    super(configuration, DOCUMENT_COLLECTION_NAME, SillyEntitySecond.class);
    this.serialization = new Serialization(getGson());
    this.anyCriteria = new Criteria(this.serialization, Constraints.nilConstraint());
  }
  
  /**
   * Inserts a single document into the collection.
   * @param document The sillyEntitySecond to insert
   * @return A future representing the number of inserted documents (1) if WriteConcern allows the insertion.
   */
  public FluentFuture insert(SillyEntitySecond document) {
    return super.doInsert(ImmutableList.of(document));
  }

  /**
   * Insert documents into the collection.
   * @param documents The documents to insert
   * @return A future representing the number of inserted documents if WriteConcern allows the insertion.
   */
  public FluentFuture insert(Iterable documents) {
    return super.doInsert(ImmutableList.copyOf(documents));
  }

  /**
   * Finds all documents. Use the returned {@link Finder} object to complete
   * {@link Finder#fetchAll() fetch all}, {@link Finder#deleteAll() delete all}, or other operations.
   * @return A finder object used to complete operations
   */
  @CheckReturnValue
  public Finder findAll() {
    return find(criteria());
  }
  
 /**
  * Find documents by the criteria expressed as a JSON string. Use the returned {@link Finder} object to complete
  * {@link Finder#fetchAll() fetch}, {@link Finder#andModifyFirst() modify}, or {@link Finder#deleteFirst() delete} operations.
  * @param jsonCriteria A JSON string for native criteria
  * @return A finder object used to complete operations
  */
  @CheckReturnValue
  public Finder find(String jsonCriteria) {
    return new Finder(this, Support.jsonQuery(jsonCriteria));
  }

  /**
   * Find documents by the {@link SillyEntitySecond#id() id} identity attribute. Use the returned {@link Finder} object to complete
   * {@link Finder#fetchFirst() fetch}, {@link Finder#andModifyFirst() modify}, or {@link Finder#deleteFirst() delete} operations.
   * @param id The exact {@code id} value
   * @return A finder object used to complete operations
   */
  @CheckReturnValue
  public Finder findById(Id id) {
    return find(criteria().id(id));
  }
  
  /**
   * Update or insert a document, matched by the identifier value of the 'id' attribute.
   * @param document The sillyEntitySecond to upsert
   * @return A future representing the of number of inserted documents (1) if WriteConcern allows the insertion.
   */
  public FluentFuture upsert(SillyEntitySecond document) {
    Criteria byId = criteria().id(document.id());
    return super.doUpsert(byId.constraint, document);
  }

  /**
   * Find a document by the given {@link SillyEntitySecondRepository#criteria() criteria}. Use the returned {@link Finder} object to complete
   * {@link Finder#fetchAll() fetch}, {@link Finder#andModifyFirst() modify}, or {@link Finder#deleteFirst() delete} operations.
   * @param criteria The search criteria
   * @return A finder object used to complete operations
   */
  @CheckReturnValue
  public Finder find(Criteria criteria) {
    return new Finder(this, criteria.constraint);
  }

  /**
   * The finder object used to proceed with find operations via the
   * {@link Finder#fetchAll()}, {@link Finder#fetchFirst()}, {@link Finder#andModifyFirst()}, or {@link Finder#deleteFirst()} methods.
   * Configure exclusion and sort ordering for results using the family of {@code exclude*()} and {@code orderBy*()} attribute-specific methods.
   * @see SillyEntitySecondRepository#find(Criteria)
   */
  @NotThreadSafe
  public static final class Finder extends Repositories.Finder {
    private final Serialization serialization;

    private Finder(SillyEntitySecondRepository repository, Constraints.ConstraintHost criteria) {
      super(repository);
      this.criteria = criteria;
      this.serialization = repository.serialization;
    }

    /**
     * Order by {@link SillyEntitySecond#id() id} in the ascending direction.
     * Specify that the next attribute to sort will be the {@link SillyEntitySecond#id() id} attribute using ascending order
     * in the the chain of comparisons performed to sort results.
     * @return {@code this} finder for use in a chained invocation
     */
    public Finder orderById() {
      ordering = ordering.equal(serialization.idName, false, 1);
      return this;
    }

    /**
     * Order by {@link SillyEntitySecond#id() id} in the descending direction.
     * Specify that the next attribute to sort will be the {@link SillyEntitySecond#id() id} attribute using descending order
     * in the the chain of comparisons performed to sort results.
     * @return {@code this} finder for use in a chained invocation
     */
    public Finder orderByIdDesceding() {
      ordering = ordering.equal(serialization.idName, false, -1);
      return this;
    }

    /**
     * Turn a find operation into an atomic {@link DBCollection#findAndModify(DBObject, DBObject, DBObject, boolean, DBObject, boolean, boolean) findAndModify}
     * operation. Use the family of {@code set*()}, {@code unset*()}, {@code add*()}, {@code remove*()}, {@code put*()}m and {@code init*()}
     * (and other attribute-specific) methods to describe the modification.
     * @return A modifier object to complete the {@code findAndModify} operation
     */
    @CheckReturnValue
    public Modifier andModifyFirst() {
      return new Modifier((SillyEntitySecondRepository) repository, criteria, ordering, exclusion);
    }
  }

  /**
   * Update the set of {@code "ent2"} documents.
   * @param criteria The search criteria for update
   * @return An updater object that will be used to complete the update.
   */
  @CheckReturnValue
  public Updater update(Criteria criteria) {
    return new Updater(this, criteria);
  }

  /**
   * {@link #update(Criteria) Given} the criteria updater describes how to perform
   * update operations on sets of documents.
   */
  @NotThreadSafe
  public static final class Updater extends Repositories.Updater {
    private final Serialization serialization;

    private Updater(SillyEntitySecondRepository repository, Criteria criteria) {
      super(repository);
      this.criteria = criteria.constraint;
      this.serialization = repository.serialization;
    }
  }

  @NotThreadSafe
  public static final class Modifier extends Repositories.Modifier {
    private final Serialization serialization;

    private Modifier(
        SillyEntitySecondRepository repository,
        Constraints.ConstraintHost criteria,
        Constraints.Constraint ordering,
        Constraints.Constraint exclusion) {
      super(repository);
      this.serialization = repository.serialization;
      this.criteria = criteria;
      this.ordering = ordering;
      this.exclusion = exclusion;
    }
  }

  /**
   * {@link DBCollection#ensureIndex(DBObject, DBObject) Ensure an index} on collection {@code "ent2"} by one or
   * more attributes using the family of {@code with*()} attribute-specific methods.
   * While indexes will usually be maintained by special administration scripts, for simple cases it is convenient
   * to ensure an index on application startup.
   * @see Indexer#named(String)
   * @see Indexer#unique()
   * @return An indexer object to be completed with the {@link Indexer#ensure()} operation.
   */
  @CheckReturnValue
  public Indexer index() {
    return new Indexer(this);
  }

  /**
   * An indexer used to create an index on the {@code "ent2"} collection if it does not exist by one or more attributes.
   * @see DBCollection#ensureIndex(DBObject, DBObject)
   */
  @NotThreadSafe
  public static final class Indexer extends Repositories.Indexer {
    private final Serialization serialization;

    private Indexer(SillyEntitySecondRepository repository) {
      super(repository);
      this.serialization = repository.serialization;
    }

    /**
     * Specify that the next attribute to index will be {@link SillyEntitySecond#id() id}, in the ascending direction.
     * @return {@code this} indexer for use in a chained invocation
     */
    public Indexer withId() {
      fields = fields.equal(serialization.idName, false, 1);
      return this;
    }

    /**
     * Specify that the next attribute to index will be {@link SillyEntitySecond#id() id}, in the descending direction.
     * @return {@code this} indexer for use in a chained invocation
     */
    public Indexer withIdDesceding() {
      fields = fields.equal(serialization.idName, false, -1);
      return this;
    }
  }

  /**
   * Search criteria.
   * Returns an initial object to create criteria by invoking methods that describe attribute specific constraints.
   * @return An empty immutable criteria
   */
  public Criteria criteria() {
    return anyCriteria;
  }

  /**
   * {@code SillyEntitySecondRepository.Criteria} is a SillyEntitySecond document search query.
   * Call methods on the criteria to add constraints for search queries.
   */
  @Immutable
  @SuppressWarnings("unchecked")
  public static final class Criteria extends Repositories.Criteria {
    private final Constraints.Constraint constraint;
    private final Serialization serialization;

    Criteria(Serialization serialization, Constraints.Constraint constraint) {
      this.constraint = constraint;
      this.serialization = serialization;
    }


    public Criteria id(Id value) {
      return new Criteria(serialization, constraint.equal(serialization.idName, false, Support.writable(serialization.idTypeAdapter, value)));
    }

    public Criteria idNot(Id value) {
      return new Criteria(serialization, constraint.equal(serialization.idName, true, Support.writable(serialization.idTypeAdapter, value)));
    }

    public Criteria idIn(Iterable values) {
      List wrappedValues = Lists.newArrayList();
      for (Id value : values) {
        wrappedValues.add(Support.writable(serialization.idTypeAdapter, value));
      }
      return new Criteria(serialization, constraint.in(serialization.idName, false, wrappedValues));
    }

    public Criteria idIn(Id first, Id second, Id... rest) {
      List values = Lists.newArrayListWithCapacity(2 + rest.length);
      values.add(Support.writable(serialization.idTypeAdapter, first));
      values.add(Support.writable(serialization.idTypeAdapter, second));
      for (Id value : rest) {
        values.add(Support.writable(serialization.idTypeAdapter, value));
      }
      return new Criteria(serialization, constraint.in(serialization.idName, false, values));
    }

    public Criteria idNotIn(Iterable values) {
      List wrappedValues = Lists.newArrayList();
      for (Id value : values) {
        wrappedValues.add(Support.writable(serialization.idTypeAdapter, value));
      }
      return new Criteria(serialization, constraint.in(serialization.idName, true, wrappedValues));
    }

    public Criteria idNotIn(Id first, Id second, Id... rest) {
      List values = Lists.newArrayListWithCapacity(2 + rest.length);
      values.add(Support.writable(serialization.idTypeAdapter, first));
      values.add(Support.writable(serialization.idTypeAdapter, second));
      for (Id value : rest) {
        values.add(Support.writable(serialization.idTypeAdapter, value));
      }
      return new Criteria(serialization, constraint.in(serialization.idName, true, values));
    }

    @Override
    public Criteria or() {
      return new Criteria(serialization, constraint.disjunction());
    }

    @Override
    public String toString() {
      return "SillyEntitySecondRepository.criteria(" + Support.stringify(constraint) + ")";
    }
  }

  private static class Serialization {
    private static final TypeToken ID_TYPE_TOKEN = TypeToken.get(Id.class);
    final TypeAdapter idTypeAdapter;
    final Gson gson;
    final String idName;

    Serialization(Gson gson) {
      this.gson = gson;
      this.idTypeAdapter = gson.getAdapter(ID_TYPE_TOKEN);
      FieldNamingTranslator fieldNaming = new FieldNamingTranslator(gson);
      this.idName = fieldNaming.translateName(SillyEntitySecond.class, Id.class, "id", "_id");
    }
  }
}