/**
* Copyright (C) 2010 Michael Mosmann <michael@mosmann.de>
*
* Licensed 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 de.flapdoodle.mongoom.datastore;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Logger;
import com.google.common.collect.Lists;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import de.flapdoodle.mongoom.annotations.Direction;
import de.flapdoodle.mongoom.logging.LogConfig;
import de.flapdoodle.mongoom.mapping.index.FieldIndex;
import de.flapdoodle.mongoom.mapping.index.IndexDef;
public final class Indexes {
static final Logger _logger=LogConfig.getLogger(Indexes.class);
private Indexes() {
}
public static void ensureIndex(DB db, IndexDef index, String collectionName) {
// public <T> void ensureIndex(Class<T> clazz, String name,
// Set<IndexFieldDef> defs, boolean unique,
// boolean dropDupsOnCreate) {
BasicDBObjectBuilder keys = BasicDBObjectBuilder.start();
BasicDBObjectBuilder keyOpts = null;
List<FieldIndex> indexSorted=Lists.newArrayList(index.fields());
Collections.sort(indexSorted, new Comparator<FieldIndex>() {
@Override
public int compare(FieldIndex o1, FieldIndex o2) {
if (o1.priority()==o2.priority()) return 0;
if (o1.priority()<o2.priority()) return 1;
return -1;
}
});
for (FieldIndex def : indexSorted) {
String fieldName = def.name();
Direction dir = def.direction();
if (dir == Direction.BOTH)
keys.add(fieldName, 1).add(fieldName, -1);
else
keys.add(fieldName, (dir == Direction.ASC)
? 1
: -1);
}
String name = index.name();
if (name != null && !name.isEmpty()) {
if (keyOpts == null)
keyOpts = new BasicDBObjectBuilder();
keyOpts.add("name", name);
}
if (index.unique()) {
if (keyOpts == null)
keyOpts = new BasicDBObjectBuilder();
keyOpts.add("unique", true);
if (index.dropDups())
keyOpts.add("dropDups", true);
}
if (index.sparse()) {
if (keyOpts == null)
keyOpts = new BasicDBObjectBuilder();
keyOpts.add("sparse", true);
}
try {
db.requestStart();
DBCollection dbColl = db.getCollection(collectionName);
DBObject indexKeys = keys.get();
// DatastoreImpl._logger.info("Ensuring index for " + dbColl.getName() + "." + index + " with keys " + indexKeys);
if (keyOpts == null) {
_logger.info("Ensuring index for " + dbColl.getName() + "." + index + " with keys " + indexKeys);
dbColl.ensureIndex(indexKeys);
} else {
DBObject options = keyOpts.get();
_logger.info("Ensuring index for " + dbColl.getName() + "." + index + " with keys " + indexKeys
+ " and opts " + options);
dbColl.ensureIndex(indexKeys, options);
}
} finally {
Errors.checkError(db, Operation.Insert);
db.requestDone();
}
}
}