예제 #1
0
        public void Explain(SourceBuilder sb, IGraphModel model)
        {
            SearchPlanNode src = SourceSPNode as SearchPlanNode;
            SearchPlanNode tgt = Element as SearchPlanNode;

            switch (Type)
            {
            case SearchOperationType.Outgoing:
                sb.AppendFront("from " + src.PatternElement.UnprefixedName + " outgoing -" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "->\n");
                break;

            case SearchOperationType.Incoming:
                sb.AppendFront("from " + src.PatternElement.UnprefixedName + " incoming <-" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "-\n");
                break;

            case SearchOperationType.Incident:
                sb.AppendFront("from " + src.PatternElement.UnprefixedName + " incident <-" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "->\n");
                break;

            case SearchOperationType.ImplicitSource:
                sb.AppendFront("from <-" + src.PatternElement.UnprefixedName + "- get source " + tgt.PatternElement.UnprefixedName + ":" + model.NodeModel.Types[tgt.PatternElement.TypeID].Name + "\n");
                break;

            case SearchOperationType.ImplicitTarget:
                sb.AppendFront("from -" + src.PatternElement.UnprefixedName + "-> get target " + tgt.PatternElement.UnprefixedName + ":" + model.NodeModel.Types[tgt.PatternElement.TypeID].Name + "\n");
                break;

            case SearchOperationType.Implicit:
                sb.AppendFront("from <-" + src.PatternElement.UnprefixedName + "-> get implicit " + tgt.PatternElement.UnprefixedName + ":" + model.NodeModel.Types[tgt.PatternElement.TypeID].Name + "\n");
                break;

            case SearchOperationType.Lookup:
                if (tgt.PatternElement is PatternNode)
                {
                    sb.AppendFront("lookup " + tgt.PatternElement.UnprefixedName + ":" + model.NodeModel.Types[tgt.PatternElement.TypeID].Name + " in graph\n");
                }
                else
                {
                    sb.AppendFront("lookup -" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "-> in graph\n");
                }
                break;

            case SearchOperationType.ActionPreset:
                sb.AppendFront("(preset: " + tgt.PatternElement.UnprefixedName + ")\n");
                break;

            case SearchOperationType.NegIdptPreset:
                sb.AppendFront("(preset: " + tgt.PatternElement.UnprefixedName + (tgt.PatternElement.PresetBecauseOfIndependentInlining ? " after independent inlining" : "") + ")\n");
                break;

            case SearchOperationType.SubPreset:
                sb.AppendFront("(preset: " + tgt.PatternElement.UnprefixedName + ")\n");
                break;

            case SearchOperationType.Condition:
                sb.AppendFront("if { depending on " + String.Join(",", ((PatternCondition)Element).NeededNodes) + ","
                               + String.Join(",", ((PatternCondition)Element).NeededEdges) + " }\n");
                break;

            case SearchOperationType.NegativePattern:
                sb.AppendFront("negative {\n");
                sb.Indent();
                ((ScheduledSearchPlan)Element).Explain(sb, model);
                sb.Append("\n");
                ((ScheduledSearchPlan)Element).PatternGraph.ExplainNested(sb, model);
                sb.Unindent();
                sb.AppendFront("}\n");
                break;

            case SearchOperationType.IndependentPattern:
                sb.AppendFront("independent {\n");
                sb.Indent();
                ((ScheduledSearchPlan)Element).Explain(sb, model);
                sb.Append("\n");
                ((ScheduledSearchPlan)Element).PatternGraph.ExplainNested(sb, model);
                sb.Unindent();
                sb.AppendFront("}\n");
                break;

            case SearchOperationType.PickFromStorage:
            case SearchOperationType.PickFromStorageDependent:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "{" + Storage.ToString() + "}\n");
                break;

            case SearchOperationType.MapWithStorage:
            case SearchOperationType.MapWithStorageDependent:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "{" + Storage.ToString() + "[" + StorageIndex.ToString() + "]}\n");
                break;

            case SearchOperationType.PickFromIndex:
            case SearchOperationType.PickFromIndexDependent:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "{" + IndexAccess.ToString() + "}\n");
                break;

            case SearchOperationType.PickByName:
            case SearchOperationType.PickByNameDependent:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "{" + NameLookup.ToString() + "}\n");
                break;

            case SearchOperationType.PickByUnique:
            case SearchOperationType.PickByUniqueDependent:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "{" + UniqueLookup.ToString() + "}\n");
                break;

            case SearchOperationType.Cast:
                sb.AppendFront(tgt.PatternElement.UnprefixedName + "<" + src.PatternElement.UnprefixedName + ">\n");
                break;

            case SearchOperationType.Assign:
                sb.AppendFront("(" + tgt.PatternElement.UnprefixedName + " = " + src.PatternElement.UnprefixedName + ")\n");
                break;

            case SearchOperationType.Identity:
                sb.AppendFront("(" + tgt.PatternElement.UnprefixedName + " == " + src.PatternElement.UnprefixedName + ")\n");
                break;

            case SearchOperationType.AssignVar:
                sb.AppendFront("(" + tgt.PatternElement.UnprefixedName + " = expr" + ")\n");
                break;

            case SearchOperationType.LockLocalElementsForPatternpath:
                sb.AppendFront("lock for patternpath\n");
                break;

            case SearchOperationType.DefToBeYieldedTo:
                if (Element is PatternVariable)
                {
                    sb.AppendFront("def " + ((PatternVariable)Element).Name + "\n");
                }
                else
                {
                    sb.AppendFront("def " + ((SearchPlanNode)Element).PatternElement.Name + "\n");
                }
                break;

            case SearchOperationType.ParallelLookup:
                if (tgt.PatternElement is PatternNode)
                {
                    sb.AppendFront("parallelized lookup " + tgt.PatternElement.UnprefixedName + ":" + model.NodeModel.Types[tgt.PatternElement.TypeID].Name + " in graph\n");
                }
                else
                {
                    sb.AppendFront("parallelized lookup -" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "-> in graph\n");
                }
                break;

            case SearchOperationType.ParallelPickFromStorage:
            case SearchOperationType.ParallelPickFromStorageDependent:
                sb.AppendFront("parallelized " + tgt.PatternElement.UnprefixedName + "{" + Storage.ToString() + "}\n");
                break;

            case SearchOperationType.ParallelOutgoing:
                sb.AppendFront("parallelized from " + src.PatternElement.UnprefixedName + " outgoing -" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "->\n");
                break;

            case SearchOperationType.ParallelIncoming:
                sb.AppendFront("parallelized from " + src.PatternElement.UnprefixedName + " incoming <-" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "-\n");
                break;

            case SearchOperationType.ParallelIncident:
                sb.AppendFront("parallelized from " + src.PatternElement.UnprefixedName + " incident <-" + tgt.PatternElement.UnprefixedName + ":" + model.EdgeModel.Types[tgt.PatternElement.TypeID].Name + "->\n");
                break;

            case SearchOperationType.WriteParallelPreset:
            case SearchOperationType.ParallelPreset:
            case SearchOperationType.WriteParallelPresetVar:
            case SearchOperationType.ParallelPresetVar:
            case SearchOperationType.SetupParallelLookup:
            case SearchOperationType.SetupParallelPickFromStorage:
            case SearchOperationType.SetupParallelPickFromStorageDependent:
            case SearchOperationType.SetupParallelOutgoing:
            case SearchOperationType.SetupParallelIncoming:
            case SearchOperationType.SetupParallelIncident:
                break;     // uninteresting to the user
            }
        }