private void Init()
        {
            _start = 0;
            _end   = 0;

            // for instance, only manage index for one field query using 'equal'
            if (_classInfo.HasIndex() && _query.HasCriteria() &&
                ((IInternalConstraint)_query.GetCriteria()).CanUseIndex())
            {
                var fields = _query.GetAllInvolvedFields();
                if (fields.IsNullOrEmpty())
                {
                    _useIndex = false;
                }
                else
                {
                    var fieldIds = GetAllInvolvedFieldIds(fields);
                    _classInfoIndex = _classInfo.GetIndexForAttributeIds(fieldIds);
                    if (_classInfoIndex != null)
                    {
                        _useIndex = true;
                    }
                }
            }

            // Keep the detail
            _details = GetDetails();
        }
Exemplo n.º 2
0
        /// <summary>
        ///   Take the fields of the index and take value from the query
        /// </summary>
        /// <param name="index"> The index </param>
        /// <returns> The key of the index </returns>
        protected virtual IOdbComparable ComputeIndexKey(ClassInfoIndex index)
        {
            var attributesNames = ClassInfo.GetAttributeNames(index.AttributeIds);
            var constraint      = Query.GetCriteria();
            var values          = ((IInternalConstraint)constraint).GetValues();

            return(IndexTool.BuildIndexKey(index.Name, values, attributesNames));
        }