/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.provisionr.amazon.core;
import com.google.common.base.Objects;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import java.util.Map;
public class ImageTableQuery {
private final ImageTable table;
private final ImmutableMap.Builder<String, String> filtersBuilder = ImmutableMap.builder();
public ImageTableQuery(ImageTable table) {
this.table = checkNotNull(table, "table is null");
}
public ImageTableQuery filterBy(String column, String value) {
filtersBuilder.put(column, value);
return this;
}
public String singleResult() {
final Map<String, String> filters = filtersBuilder.build();
final ImmutableSet.Builder<String> builder = ImmutableSet.builder();
for (String row : table.getTable().rowKeySet()) {
if (matchesFilters(table.getTable().row(row), filters)) {
builder.add(table.getTable().get(row, "ami-id"));
}
}
return Iterables.getOnlyElement(builder.build());
}
boolean matchesFilters(final Map<String, String> row, Map<String, String> filters) {
return Iterables.all(filters.entrySet(),
new Predicate<Map.Entry<String, String>>() {
@Override
public boolean apply(Map.Entry<String, String> entry) {
return Objects.equal(row.get(entry.getKey()), entry.getValue());
}
});
}
@Override
public int hashCode() {
return Objects.hashCode(table, filtersBuilder);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final ImageTableQuery other = (ImageTableQuery) obj;
return Objects.equal(this.table, other.table) && Objects.equal(this.filtersBuilder, other.filtersBuilder);
}
@Override
public String toString() {
return "ImageTableQuery{" +
"table=" + table +
", filters=" + filtersBuilder +
'}';
}
}