Package com.ikanow.infinit.e.utility

Source Code of com.ikanow.infinit.e.utility.MongoIndexerUtils

/*******************************************************************************
* Copyright 2012, The Infinit.e Open Source Project
*
* 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 com.ikanow.infinit.e.utility;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.bson.types.ObjectId;

import com.ikanow.infinit.e.data_model.store.DbManager;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

public class MongoIndexerUtils {

  public static List<BasicDBObject> getChunks(String namespace, String description)
  {
    DBCollection configDB = DbManager.getCollection("config", "chunks");
   
    BasicDBObject query = new BasicDBObject("ns", namespace);   
   
    // Parse description:
    if (!description.equalsIgnoreCase("all")) {
      if (description.startsWith("+")) {       
        query.put("_id", new BasicDBObject(DbManager.gt_, description.substring(1)));
      }
      else if (description.startsWith("@")) { // it's a list of replica sets
        String replicas[] = description.substring(1).split("\\s*,\\s*");
        query.put("shard", new BasicDBObject(DbManager.in_, replicas));
      }
      else { // assume it's a set of chunks (allow for hacky replacement because "s don't seem to get loaded from windows?)
        String ids[] = description.replace("^QUOTE^", "\"").split("\\s*,\\s*");
        query.put("_id", new BasicDBObject(DbManager.in_, ids));
      }
    }//TESTED all 3 cases
    //DEBUG
    //System.out.println("CHUNKQ=" + query.toString());
   
    // Get chunks and build queries
    DBCursor dbc = configDB.find(query);
    ArrayList<BasicDBObject> retList = new ArrayList<BasicDBObject>(dbc.count());
    while (dbc.hasNext()) {
      DBObject chunk = dbc.next();
      BasicDBObject derivedQuery = new BasicDBObject();
      BasicDBObject minObj = (BasicDBObject) chunk.get("min");
      BasicDBObject maxObj = (BasicDBObject) chunk.get("max");
      if (null != minObj) {
        BasicDBObject modifier = addChunkModifier(minObj);
        if (null != modifier)
          derivedQuery.put(DbManager.min_, modifier);
      }
      if (null != maxObj) {
        BasicDBObject modifier = addChunkModifier(maxObj);
        if (null != modifier)
          derivedQuery.put(DbManager.max_, modifier);
      }
      if (!derivedQuery.isEmpty()) {
        derivedQuery.put("$id", chunk.get("_id")); // (temp save the _id for printing in the main loop)
        retList.add(derivedQuery);
      }
    }   
    return retList;
  }//TESTED (_id, index, {sourceKey:1,_id:1}

  private static BasicDBObject addChunkModifier(BasicDBObject minOrMax)
  {
    BasicDBObject modifier = new BasicDBObject();
    Iterator<String> indexFieldIt = minOrMax.keySet().iterator();
    while (indexFieldIt.hasNext()) {
      String indexField = indexFieldIt.next();
       
      Object fieldObj = minOrMax.get(indexField);
      if ((null != fieldObj) && // else it's a min/max so can just ignore
          (fieldObj instanceof String) || (fieldObj instanceof ObjectId) || (fieldObj instanceof Number)) 
      {
        modifier.put(indexField, fieldObj);
      }
    }
    if (modifier.isEmpty())
      return null;
   
    return modifier;
  }//TESTED (single/compound indexes)
}
TOP

Related Classes of com.ikanow.infinit.e.utility.MongoIndexerUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.