/**
   * Construct a BaseHasShardIdList. {@link List} cannot be empty
   *
   * @param shardIds the {@link ShardId}s
   */
  protected BaseHasShardIdList(final List<ShardId> shardIds) {
    Preconditions.checkNotNull(shardIds);
    Preconditions.checkArgument(!shardIds.isEmpty());

    // make our own copy to be safe
    this.shardIds = new ArrayList<ShardId>(shardIds);
  }
 /**
  * Construct a ShardedSubcriteriaImpl
  *
  * @param shards the shards that we're aware of
  * @param parent our parent
  */
 public ShardedSubcriteriaImpl(List<Shard> shards, ShardedCriteria parent) {
   Preconditions.checkNotNull(shards);
   Preconditions.checkNotNull(parent);
   Preconditions.checkArgument(!shards.isEmpty());
   this.shards = shards;
   this.parent = parent;
   // let's set up our maps
   for (Shard shard : shards) {
     shardToCriteriaMap.put(shard, null);
     shardToEventListMap.put(shard, Lists.<CriteriaEvent>newArrayList());
   }
 }