Ejemplo n.º 1
0
        private static RangeIndexLookupValue[] CompileRangeLookupValues(string[] rangeIndexProps, FilterSpecParam[] parameters, AgentInstanceContext agentInstanceContext)
        {
            var result = new RangeIndexLookupValue[rangeIndexProps.Length];

            for (var rangeIndex = 0; rangeIndex < rangeIndexProps.Length; rangeIndex++)
            {
                foreach (var param in parameters)
                {
                    if (!(param.Lookupable.Expression.Equals(rangeIndexProps[rangeIndex])))
                    {
                        continue;
                    }

                    if (param.FilterOperator == FilterOperator.EQUAL || param.FilterOperator == FilterOperator.IS)
                    {
                        result[rangeIndex] = new RangeIndexLookupValueEquals(param.GetFilterValue(null, agentInstanceContext));
                    }
                    else if (param.FilterOperator.IsRangeOperator() || param.FilterOperator.IsInvertedRangeOperator())
                    {
                        QueryGraphRangeEnum opAdd = param.FilterOperator.MapFrom();
                        result[rangeIndex] = new RangeIndexLookupValueRange(param.GetFilterValue(null, agentInstanceContext), opAdd, true);
                    }
                    else if (param.FilterOperator.IsComparisonOperator())
                    {
                        var existing = result[rangeIndex];
                        QueryGraphRangeEnum opAdd = param.FilterOperator.MapFrom();
                        if (existing == null)
                        {
                            result[rangeIndex] = new RangeIndexLookupValueRange(param.GetFilterValue(null, agentInstanceContext), opAdd, true);
                        }
                        else
                        {
                            if (!(existing is RangeIndexLookupValueRange))
                            {
                                continue;
                            }
                            var existingRange = (RangeIndexLookupValueRange)existing;
                            var opExist       = existingRange.Operator;
                            var desc          = QueryGraphRangeUtil.GetCanConsolidate(opExist, opAdd);
                            if (desc != null)
                            {
                                var doubleRange = GetDoubleRange(desc.IsReverse, existing.Value, param.GetFilterValue(null, agentInstanceContext));
                                result[rangeIndex] = new RangeIndexLookupValueRange(doubleRange, desc.RangeType, false);
                            }
                        }
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// The SnapshotIndex
        /// </summary>
        /// <param name="keysAvailable">The <see cref="QueryGraphValuePairHashKeyIndex"/></param>
        /// <param name="rangesAvailable">The <see cref="QueryGraphValuePairRangeIndex"/></param>
        /// <param name="tablePair">The <see cref="Pair{IndexMultiKey, EventTableAndNamePair}"/></param>
        /// <param name="virtualDataWindow">The <see cref="VirtualDWView"/></param>
        /// <param name="attributes">The <see cref="Attribute"/> array</param>
        /// <param name="agentInstanceContext">The <see cref="AgentInstanceContext"/></param>
        /// <param name="queryPlanLogging">The <see cref="bool"/></param>
        /// <param name="queryPlanLogDestination">The <see cref="ILog"/></param>
        /// <param name="objectName">The <see cref="string"/></param>
        /// <returns>The <see cref="ICollection{EventBean}"/></returns>
        private static ICollection <EventBean> SnapshotIndex(
            QueryGraphValuePairHashKeyIndex keysAvailable,
            QueryGraphValuePairRangeIndex rangesAvailable,
            Pair <IndexMultiKey, EventTableAndNamePair> tablePair,
            VirtualDWView virtualDataWindow,
            Attribute[] attributes,
            AgentInstanceContext agentInstanceContext,
            bool queryPlanLogging,
            ILog queryPlanLogDestination,
            string objectName)
        {
            var evaluateParamsTrue = new EvaluateParams(null, true, agentInstanceContext);

            // report plan
            queryPlanReport(tablePair.Second.IndexName, tablePair.Second.EventTable, attributes, agentInstanceContext, queryPlanLogging, queryPlanLogDestination, objectName);

            // compile hash lookup values
            var tableHashProps = tablePair.First.HashIndexedProps;
            var keyValues      = new Object[tableHashProps.Length];

            for (var tableHashPropNum = 0; tableHashPropNum < tableHashProps.Length; tableHashPropNum++)
            {
                var tableHashProp = tableHashProps[tableHashPropNum];
                for (var i = 0; i < keysAvailable.Indexed.Count; i++)
                {
                    if (keysAvailable.Indexed[i].Equals(tableHashProp.IndexPropName))
                    {
                        var key   = keysAvailable.Keys[i];
                        var value = key.KeyExpr.ExprEvaluator.Evaluate(evaluateParamsTrue);
                        if (value != null)
                        {
                            value = MayCoerceNonNull(value, tableHashProp.CoercionType);
                            keyValues[tableHashPropNum] = value;
                        }
                    }
                }
            }

            // compile range lookup values
            var tableRangeProps = tablePair.First.RangeIndexedProps;
            var rangeValues     = new RangeIndexLookupValue[tableRangeProps.Length];

            for (var tableRangePropNum = 0; tableRangePropNum < tableRangeProps.Length; tableRangePropNum++)
            {
                var tableRangeProp = tableRangeProps[tableRangePropNum];
                for (var i = 0; i < rangesAvailable.Indexed.Count; i++)
                {
                    if (rangesAvailable.Indexed[i].Equals(tableRangeProp.IndexPropName))
                    {
                        var range = rangesAvailable.Keys[i];
                        if (range is QueryGraphValueEntryRangeIn)
                        {
                            var   between = (QueryGraphValueEntryRangeIn)range;
                            var   start   = between.ExprStart.ExprEvaluator.Evaluate(evaluateParamsTrue);
                            var   end     = between.ExprEnd.ExprEvaluator.Evaluate(evaluateParamsTrue);
                            Range rangeValue;
                            if (tableRangeProp.CoercionType.IsNumeric())
                            {
                                double?startDouble = null;
                                if (start != null)
                                {
                                    startDouble = start.AsDouble();
                                }
                                double?endDouble = null;
                                if (end != null)
                                {
                                    endDouble = end.AsDouble();
                                }
                                rangeValue = new DoubleRange(startDouble, endDouble);
                            }
                            else
                            {
                                rangeValue = new StringRange(start == null ? null : start.ToString(), end == null ? null : end.ToString());
                            }

                            rangeValues[tableRangePropNum] = new RangeIndexLookupValueRange(rangeValue, between.RangeType, between.IsAllowRangeReversal);
                        }
                        else
                        {
                            var relOp = (QueryGraphValueEntryRangeRelOp)range;
                            var value = relOp.Expression.ExprEvaluator.Evaluate(evaluateParamsTrue);
                            if (value != null)
                            {
                                value = MayCoerceNonNull(value, tableRangeProp.CoercionType);
                            }
                            rangeValues[tableRangePropNum] = new RangeIndexLookupValueRange(value, relOp.RangeType, true);
                        }
                    }
                }
            }

            // perform lookup
            return(FafTableLookup(virtualDataWindow, tablePair.First, tablePair.Second.EventTable, keyValues, rangeValues, attributes));
        }