// effects: Given the cells for the extent (extentCells) along with // the signatures (multiconstants + needed attributes) for this extent, generates // the left cell wrappers for it extent (viewTarget indicates whether // the view is for querying or update purposes // Modifies m_cellWrappers to contain this list private bool CreateLeftCellWrappers(IList <Cell> extentCells, ViewTarget viewTarget) { var alignedCells = AlignFields(extentCells, m_memberMaps.ProjectedSlotMap, viewTarget); Debug.Assert(alignedCells.Count == extentCells.Count, "Cell counts disagree"); // Go through all the cells and create cell wrappers that can be used for generating the view m_cellWrappers = new List <LeftCellWrapper>(); for (var i = 0; i < alignedCells.Count; i++) { var alignedCell = alignedCells[i]; var left = alignedCell.GetLeftQuery(viewTarget); var right = alignedCell.GetRightQuery(viewTarget); // Obtain the non-null projected slots into attributes var attributes = left.GetNonNullSlots(); var fromVariable = BoolExpression.CreateLiteral( new CellIdBoolean(m_identifiers, extentCells[i].CellNumber), m_memberMaps.LeftDomainMap); var leftFragmentQuery = FragmentQuery.Create(fromVariable, left); if (viewTarget == ViewTarget.UpdateView) { leftFragmentQuery = m_leftFragmentQP.CreateDerivedViewBySelectingConstantAttributes(leftFragmentQuery) ?? leftFragmentQuery; } var leftWrapper = new LeftCellWrapper( m_viewTarget, attributes, leftFragmentQuery, left, right, m_memberMaps, extentCells[i]); m_cellWrappers.Add(leftWrapper); } return(true); }