public void Add(EventBean @event, ExprEvaluatorContext exprEvaluatorContext)
        {
            _eventsPerStream[0] = @event;
            var x = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.XEval, _organization.IndexName,
                                                                   AdvancedIndexQuadTreeConstants.COL_X, _eventsPerStream, true,
                                                                   exprEvaluatorContext);
            var y = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.YEval, _organization.IndexName,
                                                                   AdvancedIndexQuadTreeConstants.COL_Y, _eventsPerStream, true,
                                                                   exprEvaluatorContext);
            var width = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.WidthEval, _organization.IndexName,
                                                                       AdvancedIndexQuadTreeConstants.COL_WIDTH, _eventsPerStream, true,
                                                                       exprEvaluatorContext);
            var height = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.HeightEval, _organization.IndexName,
                                                                        AdvancedIndexQuadTreeConstants.COL_HEIGHT, _eventsPerStream,
                                                                        true, exprEvaluatorContext);
            bool added = MXCIFQuadTreeRowIndexAdd.Add(x, y, width, height, @event, _quadTree, _organization.IsUnique,
                                                      _organization.IndexName);

            if (!added)
            {
                throw AdvancedIndexEvaluationHelper.InvalidColumnValue(_organization.IndexName, "(x,y,width,height)",
                                                                       "(" + x + "," + y + "," + width + "," + height + ")",
                                                                       "a value intersecting index bounding box (range-end-inclusive) " + _quadTree.Root.Bb);
            }
        }
        public void Remove(EventBean @event, ExprEvaluatorContext exprEvaluatorContext)
        {
            _eventsPerStream[0] = @event;
            double x = AdvancedIndexEvaluationHelper.EvalDoubleColumn(
                _config.XEval, _organization.IndexName, AdvancedIndexQuadTreeConstants.COL_X, _eventsPerStream, false,
                exprEvaluatorContext);
            double y = AdvancedIndexEvaluationHelper.EvalDoubleColumn(
                _config.YEval, _organization.IndexName, AdvancedIndexQuadTreeConstants.COL_Y, _eventsPerStream, false,
                exprEvaluatorContext);

            PointRegionQuadTreeRowIndexRemove.Remove(x, y, @event, _quadTree);
        }
        internal static AdvancedIndexConfigContextPartition ConfigureQuadTree(
            string indexName, ExprEvaluator[] parameters, ExprEvaluatorContext exprEvaluatorContext)
        {
            var x = AdvancedIndexEvaluationHelper.EvalDoubleParameter(parameters[0], indexName,
                                                                      AdvancedIndexQuadTreeConstants.PARAM_XMIN, exprEvaluatorContext);
            var y = AdvancedIndexEvaluationHelper.EvalDoubleParameter(parameters[1], indexName,
                                                                      AdvancedIndexQuadTreeConstants.PARAM_YMIN, exprEvaluatorContext);
            var width = AdvancedIndexEvaluationHelper.EvalDoubleParameter(parameters[2], indexName,
                                                                          AdvancedIndexQuadTreeConstants.PARAM_WIDTH, exprEvaluatorContext);

            if (width <= 0)
            {
                throw AdvancedIndexEvaluationHelper.InvalidParameterValue(indexName,
                                                                          AdvancedIndexQuadTreeConstants.PARAM_WIDTH, width, "value>0");
            }

            var height = AdvancedIndexEvaluationHelper.EvalDoubleParameter(parameters[3], indexName,
                                                                           AdvancedIndexQuadTreeConstants.PARAM_HEIGHT, exprEvaluatorContext);

            if (height <= 0)
            {
                throw AdvancedIndexEvaluationHelper.InvalidParameterValue(indexName,
                                                                          AdvancedIndexQuadTreeConstants.PARAM_HEIGHT, height, "value>0");
            }

            var leafCapacity = parameters.Length > 4
                ? AdvancedIndexEvaluationHelper.EvalIntParameter(parameters[4], indexName,
                                                                 AdvancedIndexQuadTreeConstants.PARAM_LEAFCAPACITY, exprEvaluatorContext)
                : PointRegionQuadTreeFactory <object> .DEFAULT_LEAF_CAPACITY;

            if (leafCapacity < 1)
            {
                throw AdvancedIndexEvaluationHelper.InvalidParameterValue(indexName,
                                                                          AdvancedIndexQuadTreeConstants.PARAM_LEAFCAPACITY, leafCapacity, "value>=1");
            }

            var maxTreeHeight = parameters.Length > 5
                ? AdvancedIndexEvaluationHelper.EvalIntParameter(parameters[5], indexName,
                                                                 AdvancedIndexQuadTreeConstants.PARAM_MAXTREEHEIGHT, exprEvaluatorContext)
                : PointRegionQuadTreeFactory <object> .DEFAULT_MAX_TREE_HEIGHT;

            if (maxTreeHeight < 2)
            {
                throw AdvancedIndexEvaluationHelper.InvalidParameterValue(indexName,
                                                                          AdvancedIndexQuadTreeConstants.PARAM_MAXTREEHEIGHT, maxTreeHeight, "value>=2");
            }

            return(new AdvancedIndexConfigContextPartitionQuadTree(x, y, width, height, leafCapacity, maxTreeHeight));
        }
        public void Remove(EventBean @event, ExprEvaluatorContext exprEvaluatorContext)
        {
            _eventsPerStream[0] = @event;
            var x = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.XEval, _organization.IndexName,
                                                                   AdvancedIndexQuadTreeConstants.COL_X, _eventsPerStream, false,
                                                                   exprEvaluatorContext);
            var y = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.YEval, _organization.IndexName,
                                                                   AdvancedIndexQuadTreeConstants.COL_Y, _eventsPerStream, false,
                                                                   exprEvaluatorContext);
            var width = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.WidthEval, _organization.IndexName,
                                                                       AdvancedIndexQuadTreeConstants.COL_WIDTH, _eventsPerStream, false,
                                                                       exprEvaluatorContext);
            var height = AdvancedIndexEvaluationHelper.EvalDoubleColumn(_config.HeightEval, _organization.IndexName,
                                                                        AdvancedIndexQuadTreeConstants.COL_HEIGHT, _eventsPerStream,
                                                                        false, exprEvaluatorContext);

            MXCIFQuadTreeRowIndexRemove.Remove(x, y, width, height, @event, _quadTree);
        }
        public void Add(EventBean @event, ExprEvaluatorContext exprEvaluatorContext)
        {
            _eventsPerStream[0] = @event;
            double x = AdvancedIndexEvaluationHelper.EvalDoubleColumn(
                _config.XEval, _organization.IndexName, AdvancedIndexQuadTreeConstants.COL_X, _eventsPerStream, true,
                exprEvaluatorContext);
            double y = AdvancedIndexEvaluationHelper.EvalDoubleColumn(
                _config.YEval, _organization.IndexName, AdvancedIndexQuadTreeConstants.COL_Y, _eventsPerStream, true,
                exprEvaluatorContext);
            bool added = PointRegionQuadTreeRowIndexAdd.Add(x, y, @event, _quadTree, _organization.IsUnique,
                                                            _organization.IndexName);

            if (!added)
            {
                throw AdvancedIndexEvaluationHelper.InvalidColumnValue(_organization.IndexName, "(x,y)",
                                                                       "(" + x + "," + y + ")",
                                                                       "a value within index bounding box (range-end-non-inclusive) " + _quadTree.Root.Bb);
            }
        }