private void ResetItemTriggeredRefresh() { var props = new HashSet <Property>(); var workQueue = new Queue <QueryX>(); Owner.ClearItemTriggeredRefresh(); foreach (var cx in _computeXManager.Items) { if (_relation_ComputeX_QueryX.TryGetChild(cx, out QueryX qh)) { SetTriggers(cx, qh); } } foreach (var gx in _graphXManager.Items) { if (_relation_GraphX_QueryX.TryGetChildren(gx, out IList <QueryX> roots)) { foreach (var qh in roots) { SetTriggers(gx, qh); } } } void SetTriggers(Item ti, QueryX qh) { workQueue.Clear(); workQueue.Enqueue(qh); while (workQueue.Count > 0) { var qx = workQueue.Dequeue(); props.Clear(); qx.GetPropertyRefs(props); foreach (var p in props) { p.IsRefreshTriggerItem = true; Owner.AddItemTriggeredRefresh(p, ti); } if (_relation_Relation_QueryX.TryGetParent(qx, out Relation r)) { r.IsRefreshTriggerItem = true; Owner.AddItemTriggeredRefresh(r, ti); } if (_relation_QueryX_QueryX.TryGetChildren(qx, out IList <QueryX> list)) { foreach (var q in list) { workQueue.Enqueue(q); } } } } }
ValType GetRelatedValueType(ComputeX cx) { if (!_relation_ComputeX_QueryX.TryGetChild(cx, out QueryX qx)) { return(ValType.IsInvalid); //computeX must have a root queryX reference } if (!_relation_QueryX_QueryX.TryGetChildren(qx, out IList <QueryX> list1)) { return(ValType.IsInvalid); //computeX must have atleast one queryX reference } var workQueue = new Queue <QueryX>(list1); var isMultiple = list1.Count > 1; var vTypes = new HashSet <ValType>(); while (workQueue.Count > 0) {/* * deapth first traversal of queryX true */ var qt = workQueue.Dequeue(); if (_relation_Relation_QueryX.TryGetParent(qt, out Relation r) && (r.Pairing == Pairing.ManyToMany || (!qt.IsReversed && r.Pairing == Pairing.OneToMany))) { isMultiple = true; } if (qt.HasValidSelect && qt.Select.ValueType < ValType.MaximumType) { vTypes.Add(qt.Select.ValueType); } if (_relation_QueryX_QueryX.TryGetChildren(qt, out IList <QueryX> list2)) { isMultiple |= list2.Count > 1; foreach (var child in list2) { workQueue.Enqueue(child); } } } if (vTypes.Count == 0) { return(ValType.IsInvalid); //computeX must have atleast one valid related value } var vType = ValType.IsInvalid; var vGroup = ValGroup.None; foreach (var vt in vTypes) { vGroup |= Value.GetValGroup(vt); // compose an aggregate of value group bit flags if (vType == ValType.IsInvalid) { vType = vt; // get the first valType } } if (vGroup == ValGroup.None) { return(ValType.IsInvalid); //computeX must have atleast one valid related value } if (vGroup.HasFlag(ValGroup.ArrayGroup)) { isMultiple = true; } if (vTypes.Count == 1) { if (isMultiple) { vType |= ValType.IsArray; } else { vType &= ~ValType.IsArray; } } else { if (vGroup == ValGroup.DateTime) { vType = (isMultiple) ? ValType.DateTimeArray : ValType.DateTime; } else if (vGroup == ValGroup.DateTimeArray) { vType = ValType.DateTimeArray; } else if (vGroup.HasFlag(ValGroup.DateTime) || vGroup.HasFlag(ValGroup.DateTimeArray)) { vType = ValType.StringArray; } else if (vGroup.HasFlag(ValGroup.ScalarGroup) && !vGroup.HasFlag(ValGroup.ArrayGroup)) { if (vGroup.HasFlag(ValGroup.String)) { vType = ValType.StringArray; } else if (vGroup.HasFlag(ValGroup.Double)) { vType = ValType.DoubleArray; } else if (vGroup.HasFlag(ValGroup.Long)) { vType = ValType.Int64Array; } else if (vGroup.HasFlag(ValGroup.Int)) { vType = ValType.Int32Array; } else if (vGroup.HasFlag(ValGroup.Bool)) { vType = ValType.BoolArray; } } else { vType = ValType.StringArray; } } return(vType); }