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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }