private List <List <string> > SelectWithIndexWhere(string indexName, string tableName) { try { var records = new List <List <string> >(); // only returns the names of the columns in the index, discarding the other parts of the index name (INDEX_<TableName>_....) var columnsIndex = indexName.Split('_').Where(elem => elem != "Index" && !tableName.Contains(elem)).ToList(); if (columnsIndex.Count == 1) { FilterDefinition <BsonDocument> filter = Builders <BsonDocument> .Filter.Empty; foreach (var condition in WhereConditionsList.Find(elem => elem.Key == tableName).Value) { var conditionSplit = condition.Item2.Split(' '); switch (conditionSplit[0]) { case "=": { filter &= Builders <BsonDocument> .Filter.Eq("_id", conditionSplit[1]); } break; case "<": { filter &= Builders <BsonDocument> .Filter.Lt("_id", conditionSplit[1]); } break; case ">": { filter &= Builders <BsonDocument> .Filter.Gt("_id", conditionSplit[1]); } break; case "<=": { filter &= Builders <BsonDocument> .Filter.Lte("_id", conditionSplit[1]); } break; case ">=": { filter &= Builders <BsonDocument> .Filter.Gte("_id", conditionSplit[1]); } break; case "<>": { filter &= Builders <BsonDocument> .Filter.Ne("_id", conditionSplit[1]); } break; case "!=": { filter &= Builders <BsonDocument> .Filter.Ne("_id", conditionSplit[1]); } break; } } var keyValuePairs = MongoDB.GetCollectionFilteredByKey(indexName, filter); foreach (var keyValue in keyValuePairs) { // if we use an index file for reading data, only the value needs to be kept, for key-lookup var keys = keyValue.GetElement("value").Value.ToString().Split('#').ToList(); records.AddRange(PerformKeyLookup(keys, tableName)); } } return(records); } catch (Exception ex) { throw ex; } }
private List <string> SelectWithIndexWhere(string indexName, bool pkFlag) { try { var records = new List <string>(); // only returns the names of the columns in the index, discarding the other parts of the index name (INDEX_<TableName>_....) var columnsIndex = indexName.Split('_').Where(elem => elem != "Index" && !TableName.Contains(elem)).ToList(); if (columnsIndex.Count == 1 || pkFlag == true) { // single-attribute index or selecting using a primary key condition FilterDefinition <BsonDocument> filter = Builders <BsonDocument> .Filter.Empty; foreach (var condition in WhereConditionsList) { var conditionSplit = condition.Item2.Split(' '); switch (conditionSplit[0]) { case "=": { filter &= Builders <BsonDocument> .Filter.Eq("_id", conditionSplit[1]); } break; case "<": { filter &= Builders <BsonDocument> .Filter.Lt("_id", conditionSplit[1]); } break; case ">": { filter &= Builders <BsonDocument> .Filter.Gt("_id", conditionSplit[1]); } break; case "<=": { filter &= Builders <BsonDocument> .Filter.Lte("_id", conditionSplit[1]); } break; case ">=": { filter &= Builders <BsonDocument> .Filter.Gte("_id", conditionSplit[1]); } break; case "<>": { filter &= Builders <BsonDocument> .Filter.Ne("_id", conditionSplit[1]); } break; case "!=": { filter &= Builders <BsonDocument> .Filter.Ne("_id", conditionSplit[1]); } break; } } var keyValuePairs = MongoDB.GetCollectionFilteredByKey(indexName, filter); foreach (var keyValue in keyValuePairs) { if (pkFlag == true) { records.Add(keyValue.GetElement("_id").Value + "#" + keyValue.GetElement("value").Value); } else { // if we use an index file for reading data, only the value needs to be kept, for key-lookup records.Add(keyValue.GetElement("value").Value.ToString()); } } } else { // multi-attribute index => needs separate filtering var unfilteredRecords = MongoDB.GetEntireCollection(indexName); var groupedConditions = new List <KeyValuePair <string, List <string> > >(); foreach (var condition in WhereConditionsList) { if (groupedConditions.Find(elem => elem.Key == condition.Item1.Item2).Value == null) { groupedConditions.Add(new KeyValuePair <string, List <string> >(condition.Item1.Item2, new List <string>())); } groupedConditions.Find(elem => elem.Key == condition.Item1.Item2).Value.Add(condition.Item2); } foreach (var indexRecord in unfilteredRecords) { var indRec = indexRecord.GetElement("_id").Value + "#" + indexRecord.GetElement("value").Value; if (RecordKeyMatchesCondition(indRec, groupedConditions)) { if (pkFlag == true) { records.Add(indexRecord.GetElement("_id").Value + "#" + indexRecord.GetElement("value").Value); } else { // if we use an index file for reading data, only the value needs to be kept, for key-lookup records.Add(indexRecord.GetElement("value").Value.ToString()); } } } } return(records); } catch (Exception ex) { throw ex; } }