/// <summary>
        /// Ctor.
        /// </summary>
        /// <param name="streamNum">the stream number that is indexed</param>
        /// <param name="eventType">types of events indexed</param>
        /// <param name="optionalKeyedProps">The optional keyed props.</param>
        /// <param name="optKeyCoercedTypes">The opt key coerced types.</param>
        /// <param name="rangeProps">The range props.</param>
        /// <param name="optRangeCoercedTypes">property types</param>
        public PropertyCompositeEventTableFactory(int streamNum, EventType eventType, IList <String> optionalKeyedProps, IList <Type> optKeyCoercedTypes, IList <String> rangeProps, IList <Type> optRangeCoercedTypes)
        {
            _streamNum            = streamNum;
            _rangeProps           = rangeProps;
            _optionalKeyedProps   = optionalKeyedProps;
            _optKeyCoercedTypes   = optKeyCoercedTypes;
            _optRangeCoercedTypes = optRangeCoercedTypes;

            // construct chain
            var enterRemoves = new List <CompositeIndexEnterRemove>();

            if (optionalKeyedProps != null && optionalKeyedProps.Count > 0)
            {
                enterRemoves.Add(new CompositeIndexEnterRemoveKeyed(eventType, optionalKeyedProps, optKeyCoercedTypes));
            }
            int count = 0;

            foreach (String rangeProp in rangeProps)
            {
                var coercionType = optRangeCoercedTypes == null ? null : optRangeCoercedTypes[count];
                enterRemoves.Add(new CompositeIndexEnterRemoveRange(eventType, rangeProp, coercionType));
                count++;
            }

            // Hook up as chain for remove
            CompositeIndexEnterRemove last = null;

            foreach (CompositeIndexEnterRemove action in enterRemoves)
            {
                if (last != null)
                {
                    last.SetNext(action);
                }
                last = action;
            }
            _chain = enterRemoves[0];
        }