internal override bool VisitLeaf(LeafCellTreeNode node, bool dummy) { CellQuery rightCellQuery1 = this.m_wrapper.RightCellQuery; CellQuery rightCellQuery2 = node.LeftCellWrapper.RightCellQuery; List <MemberPath> memberPathList = new List <MemberPath>(); if (rightCellQuery1 != rightCellQuery2) { for (int slotNum = 0; slotNum < rightCellQuery1.NumProjectedSlots; ++slotNum) { MemberProjectedSlot memberProjectedSlot1 = rightCellQuery1.ProjectedSlotAt(slotNum) as MemberProjectedSlot; if (memberProjectedSlot1 != null) { MemberProjectedSlot memberProjectedSlot2 = rightCellQuery2.ProjectedSlotAt(slotNum) as MemberProjectedSlot; if (memberProjectedSlot2 != null) { MemberPath projectedSlot = this.m_viewgenContext.MemberMaps.ProjectedSlotMap[slotNum]; if (!projectedSlot.IsPartOfKey && !MemberPath.EqualityComparer.Equals(memberProjectedSlot1.MemberPath, memberProjectedSlot2.MemberPath)) { memberPathList.Add(projectedSlot); } } } } } if (memberPathList.Count > 0) { this.m_errorLog.AddEntry(new ErrorLog.Record(ViewGenErrorCode.NonKeyProjectedWithOverlappingPartitions, Strings.ViewGen_NonKeyProjectedWithOverlappingPartitions((object)MemberPath.PropertiesToUserString((IEnumerable <MemberPath>)memberPathList, false)), (IEnumerable <LeftCellWrapper>) new LeftCellWrapper[2] { this.m_wrapper, node.LeftCellWrapper }, string.Empty)); } return(true); }
private static bool IsMemberPartOfNotNullCondition(IEnumerable <LeftCellWrapper> wrappers, MemberPath leftMember, ViewTarget viewTarget) { foreach (var leftCellWrapper in wrappers) { CellQuery leftCellQuery = leftCellWrapper.OnlyInputCell.GetLeftQuery(viewTarget); if (HasNotNullCondition(leftCellQuery, leftMember)) { return(true); } //Now figure out corresponding right side MemberPath CellQuery rightCellQuery = leftCellWrapper.OnlyInputCell.GetRightQuery(viewTarget); int indexOfMemberInProjection = leftCellQuery.GetProjectedMembers().TakeWhile(path => !path.Equals(leftMember)).Count(); //Member with condition is projected, so check opposite CellQuery's condition if (indexOfMemberInProjection < leftCellQuery.GetProjectedMembers().Count()) { MemberPath rightmember = ((MemberProjectedSlot)rightCellQuery.ProjectedSlotAt(indexOfMemberInProjection)).MemberPath; if (HasNotNullCondition(rightCellQuery, rightmember)) { return(true); } } } return(false); }
private static bool IsMemberPartOfNotNullCondition( IEnumerable <LeftCellWrapper> wrappers, MemberPath leftMember, ViewTarget viewTarget) { foreach (LeftCellWrapper wrapper in wrappers) { CellQuery leftQuery = wrapper.OnlyInputCell.GetLeftQuery(viewTarget); if (ErrorPatternMatcher.HasNotNullCondition(leftQuery, leftMember)) { return(true); } CellQuery rightQuery = wrapper.OnlyInputCell.GetRightQuery(viewTarget); int slotNum = leftQuery.GetProjectedMembers().TakeWhile <MemberPath>((Func <MemberPath, bool>)(path => !path.Equals(leftMember))).Count <MemberPath>(); if (slotNum < leftQuery.GetProjectedMembers().Count <MemberPath>()) { MemberPath memberPath = ((MemberProjectedSlot)rightQuery.ProjectedSlotAt(slotNum)).MemberPath; if (ErrorPatternMatcher.HasNotNullCondition(rightQuery, memberPath)) { return(true); } } } return(false); }
private MemberPath GetRightMemberPath(MemberPath conditionMember, LeftCellWrapper leftCellWrapper) { CellQuery rightCellQuery = leftCellWrapper.OnlyInputCell.GetRightQuery(ViewTarget.QueryView); var projectPositions = rightCellQuery.GetProjectedPositions(conditionMember); //Make the case simple. If the member is mapped more than once in the same cell wrapper //we are not going try and guess the pattern if (projectPositions.Count != 1) { return(null); } int firstProjectedPosition = projectPositions.First(); CellQuery leftCellQuery = leftCellWrapper.OnlyInputCell.GetLeftQuery(ViewTarget.QueryView); return(((MemberProjectedSlot)leftCellQuery.ProjectedSlotAt(firstProjectedPosition)).MemberPath); }
internal override bool VisitLeaf(LeafCellTreeNode node, bool dummy) { // make sure all projected attributes in wrapper correspond exactly to those in node CellQuery thisQuery = m_wrapper.RightCellQuery; CellQuery thatQuery = node.LeftCellWrapper.RightCellQuery; List <MemberPath> collidingColumns = new List <MemberPath>(); if (thisQuery != thatQuery) { for (int i = 0; i < thisQuery.NumProjectedSlots; i++) { MemberProjectedSlot thisSlot = thisQuery.ProjectedSlotAt(i) as MemberProjectedSlot; if (thisSlot != null) { MemberProjectedSlot thatSlot = thatQuery.ProjectedSlotAt(i) as MemberProjectedSlot; if (thatSlot != null) { MemberPath tableMember = m_viewgenContext.MemberMaps.ProjectedSlotMap[i]; if (!tableMember.IsPartOfKey) { if (!MemberPath.EqualityComparer.Equals(thisSlot.MemberPath, thatSlot.MemberPath)) { collidingColumns.Add(tableMember); } } } } } } if (collidingColumns.Count > 0) { string columnsString = MemberPath.PropertiesToUserString(collidingColumns, false); string message = Strings.ViewGen_NonKeyProjectedWithOverlappingPartitions(columnsString); ErrorLog.Record record = new ErrorLog.Record(true, ViewGenErrorCode.NonKeyProjectedWithOverlappingPartitions, message, new LeftCellWrapper[] { m_wrapper, node.LeftCellWrapper }, String.Empty); m_errorLog.AddEntry(record); } return(true); }