Commits

Tuukka Norri committed 4e05a16

Added message sequence images and a makefile to generate them

Comments (0)

Files changed (19)

Documentation/image-src/Makefile

+PREFIX = ../images/
+TARGETS = \
+	class-hierarchy.pdf \
+	class-hierarchy.png \
+	object-relationships.pdf \
+	object-relationships.png \
+	connect.eps \
+	connect.png \
+	update-change-propagation.eps \
+	update-change-propagation.png
+
+
+all: $(TARGETS)
+	mv $(TARGETS) $(PREFIX)
+
+
+clean:
+	rm -f $(TARGETS) $(addprefix $(PREFIX),$(TARGETS))
+
+
+%.png : %.msc
+	$(MSCGEN) -T png -o $@ $<
+
+
+%.eps : %.msc
+	$(MSCGEN) -T eps -o $@ $<
+
+
+%.pdf : %.dot
+	$(DOT) -Tpdf -o$@ $<
+
+
+%.png : %.dot
+	$(DOT) -Tpng -o$@ $<

Documentation/image-src/class-hierarchy.dot

+digraph baseten_class_hierarchy
+{
+	compound=true;
+	rankdir="RL";
+	
+	node [shape = box]
+		NSObject
+		NSProxy
+		NSException
+		BXDatabaseContext
+		BXDatabaseObject
+		BXDatabaseObjectID
+		BXException
+
+        BXDatabaseObjectModel
+        BXDatabaseObjectModelStorage
+		
+		BXAbstractDescription
+		BXEntityDescription
+		BXPropertyDescription
+		BXAttributeDescription
+		BXRelationshipDescription
+		
+		BXContainerProxy
+		BXArrayProxy
+		BXSetProxy;
+		
+	node [shape = diamond]
+		NSObjectProtocol [label = NSObject]
+		BXDatabaseContextDelegate;
+		
+	edge [arrowhead = onormal]
+		NSObject -> NSObjectProtocol 
+		NSProxy -> NSObjectProtocol
+		BXDatabaseContext -> NSObject
+		BXDatabaseObject -> NSObject
+		BXDatabaseObjectID -> NSObject
+
+        BXDatabaseObjectModel -> NSObject
+        BXDatabaseObjectModelStorage -> NSObject
+
+		NSException:w -> NSObject
+		BXException -> NSException
+	
+		BXAbstractDescription -> NSObject
+		BXEntityDescription -> BXAbstractDescription
+		BXPropertyDescription -> BXAbstractDescription
+		BXAttributeDescription -> BXPropertyDescription
+		BXRelationshipDescription -> BXPropertyDescription
+	
+		BXContainerProxy -> NSProxy
+		BXArrayProxy -> BXContainerProxy
+		BXSetProxy -> BXContainerProxy
+	
+		BXDatabaseContextDelegate -> NSObjectProtocol;
+}

Documentation/image-src/connect.msc

+msc
+{
+    hscale = "1.5";
+
+    d   [ label = "Delegate" ],
+    ctx [ label = "Database context" ],
+    c   [ label = "Connector" ] ;
+
+    d=>ctx [ label = "-connect:" ];
+    ctx->c [ label = "Begin connection attempt" ];
+    c->c   [ label = "Display connection panel" ];
+    ...    [ label = "User sets the host name" ];
+    ...;
+    c=>>d  [ label = "-databaseContextGotDatabaseURI:" ];
+    d->d   [ label = "Prepare entities" ];
+    d>>c;
+    c->c   [ label = "Continue connecting" ];
+    ...    [ label = "Connection gets negotiated" ];
+    ...;
+    ---    [ label = "Connection attempt finished" ];
+    c=>>d  [ label = "-databaseContextConnectionSucceeded: or -databaseContext:failedToConnect:" ];
+}

Documentation/image-src/object-relationships.dot

+digraph baseten_relationships 
+{	
+	compound = true;
+	
+	node [shape = box]
+        BXArrayProxy
+        BXDatabaseObjectModel
+        BXDatabaseObjectModelStorage
+		BXEntityDescription
+		BXDatabaseObject
+		BXDatabaseObjectID
+        BXAttributeDescription
+        BXRelationshipDescription
+        BXSetProxy
+        BXDatabaseContext;		
+	
+	node [shape = ellipse]
+		"Object URI"
+		"Owning object"
+        "Column values"
+        "Related objects";
+	
+	BXDatabaseContext -> BXDatabaseObject [arrowtail = normal, arrowhead = normalnormal];	
+    BXDatabaseContext -> BXDatabaseObjectModel [arrowhead = normal];
+
+    BXDatabaseObjectModelStorage -> BXDatabaseObjectModel [arrowtail = normal, arrowhead = normalnormal];
+	BXDatabaseObjectModel -> BXEntityDescription [arrowtail = normal, arrowhead = normalnormal];
+
+	BXArrayProxy -> BXDatabaseObject [arrowhead = normalnormal]
+	
+	BXDatabaseObject -> "Column values" [arrowhead = normalnormal];
+	BXDatabaseObject -> BXDatabaseObjectID:n [arrowhead = normal];
+    BXDatabaseObject -> BXSetProxy [arrowtail = normal, arrowhead = normalnormal];
+	BXSetProxy -> "Related objects" [arrowhead = normalnormal];
+	
+	BXDatabaseObjectID:s -> BXEntityDescription;
+	BXDatabaseObjectID -> "Object URI";
+	
+	BXEntityDescription -> BXAttributeDescription [arrowhead = normalnormal, arrowtail = normal];
+	BXEntityDescription -> BXRelationshipDescription [arrowhead = normalnormal, arrowtail = normal];
+	
+	"Owning object" -> BXArrayProxy [arrowhead = normal, arrowtail = normal];
+}

Documentation/image-src/operator-handling.dot

+digraph G
+{
+	rankdir = "LR";
+	{
+		node []		
+		start2 [label = "Equality"]
+		end2 [label = "End"]
+		
+		start1 [label = "Lt, gt, lte, gte,\nbetween"]
+		end1 [label = "End"]
+		
+		start3 [label = "Contains"]
+		end3 [label = "End"]
+		
+		start4 [label = "In"]
+		end4 [label = "End"]
+		
+		start5 [label = "Begins, ends, like,\nmatches, (in)"]
+		end5 [label = "End"]
+		
+		start6 [label = "Custom selector"]
+		end6 [label = "End"]
+	}
+	{
+		node [shape = box]
+		P1 [label = "Add collect all\nto stack"]
+		P2 [label = "Add the operation\nto stack"]
+
+		P3 [label = "Add collect all\nto stack"]
+		P4 [label = "Add the operation\nto stack"]
+		
+		P5 [label = "Handle like ”equals” with ANY qualifier"]
+		
+		P6 [label = "Swap lval and rval"]
+		P7 [label = "Handle as a string operation"]
+		P8 [label = "Handle like equals with ANY qualifier"]
+		P9 [label = "Add collect all\nto stack"]
+		
+		P10 [label = "Escape [%\\_] in rval,\nprepend or append % for begins, ends, in"]
+		P11 [label = "Add the operation\nto stack"]
+		P13 [label = "Add collect all\nto stack"]
+		
+		P12 [label = "Add collect all\nto stack"]
+	}
+	{
+		node [shape = diamond]
+		D1 [label = "Is there an ANY or\nALL qualifier?"]
+		D2 [label = "Are lval and rval\nboth scalars?"]
+		D3 [label = "Is lval a collection\nand rval a scalar?"]		
+		
+		D4 [label = "Is there an ANY or\nALL qualifier?"]
+		D5 [label = "Is lval a collection\nand rval a scalar?"]		
+		D6 [label = "Are lval and rval\nof the same type?"]
+		
+		D7 [label = "Is rval a scalar?"]
+		D8 [label = "Is lval a scalar?"]
+		
+		D9 [label = "Is rval a scalar?"]
+		D10 [label = "Is there an ANY or\nALL qualifier?"]
+		D11 [label = "Is lval a scalar?"]
+		D12 [label = "Is lval a collection?"]
+	}
+	
+	start2 -> D4
+	D4 -> D5 [label=y]
+	D4 -> D6 [label=n]
+	D5 -> P4 [label=y]
+	D5 -> P3 [label=n]
+	D6 -> P4 [label=y]
+	D6 -> P3 [label=n]
+	P3 -> end2
+	P4 -> end2
+	
+	start1 -> D1
+	D1 -> D3 [label=y]
+	D1 -> D2 [label=n]
+	D2 -> P2 [label=y]
+	D2 -> P1 [label=n]
+	D3 -> P2 [label=y]
+	D3 -> P1 [label=n]
+	P1 -> end1
+	P2 -> end1
+	
+	start3 -> P5 -> end3
+	
+	start4 -> P6
+	P6 -> D7
+	D7 -> D8 [label=y]
+	D7 -> P9 [label=n]
+	D8 -> P7 [label=y]
+	D8 -> P8 [label=n]
+	P7 -> end4
+	P8 -> end4
+	P9 -> end4
+		
+	start5 -> D9
+	D9 -> P10 [label=y]
+	D9 -> P13 [label=n]
+	P10 -> D10
+	D10 -> D12 [label=y]
+	D10 -> D11 [label=n]
+	D11 -> P11 [label=y]
+	D11 -> P13 [label=n]
+	D12 -> P11 [label=y]
+	D12 -> P13 [label=n]
+	P11 -> end5
+	P13 -> end5
+	
+	start6 -> P12 -> end6
+}

Documentation/image-src/scalar-or-collection.dot

+digraph G
+{
+	rankdir = "TB";
+	{
+		node []
+		start [label = "Begin"]
+		end [label = "End"]
+	}
+	{
+		node [shape = box]
+		P1 [label = "Set type to scalar"]
+		P2 [label = "Set type to collection"]
+		P3 [label = "Set type to unexpected"]
+		P4 [label = "Set type to function's cardinality"]
+		P5 [label = "Get function object\n(based on cardinality)"]
+		P6 [label = "Get node"]
+	}
+	{
+		node [shape = diamond]
+		D1 [label = "Node type?"]
+		D2 [label = "Is to-many?"]
+		D3 [label = "Nodes left?"]
+		D4 [label = "Function value?"]
+		D5 [label = "Nodes left?"]
+		D6 [label = "Got node?"]
+		D7 [label = "Have at least one\nproperty node?"]
+	}
+	{
+		node [shape = parallelogram]
+		R1 [label = "Get current node name"]
+		R2 [label = "Get current function name"]
+	}
+	
+	start -> P1 -> R1 -> P6 -> D6
+	D6 -> D1 [label=y]
+	D6 -> D7 [label=n]
+	D7 -> P5 [label=y]
+	D7 -> P3 [label=n]
+	D1 -> R2 [label = "Attribute"]
+	D1 -> D2 [label = "Relationship"]
+	D2 -> P2 [label=y]
+	D2 -> D3 [label=n]
+	P2 -> D3
+	D3 -> R1 [label=y]
+	D3 -> R2 [label=n]
+	R2 -> P5 -> D4
+	D4 -> P4 [label = "non-nil"]
+	D4 -> P3 [label = nil]
+	P4 -> D5
+	D5 -> R2 [label=y]
+	P3 -> end
+	D5 -> end [label=n]
+}

Documentation/image-src/update-change-propagation.msc

+msc
+{
+    hscale = "3";
+
+    a    [ label = "Client A" ],
+    obja [ label = "Database object" ],
+    ctxa [ label = "A's Database context" ],
+    db   [ label = "Database server" ],
+    ctxb [ label = "B's Database context" ],
+    objb [ label = "Database object" ],
+    b    [ label = "Client B" ];
+     
+    a=>obja    [ label = "-setPrimitiveValue:forKey:" ];
+    obja=>obja [ label = "Cache the given value" ];
+    obja=>ctxa [ label = "Update the database" ];
+    ctxa=>db   [ label = "Send the UPDATE query" ];
+    db=>ctxb   [ label = "Notify the other clients about rows being changed" ];
+    ctxb=>db   [ label = "Send a SELECT query" ];
+    db>>ctxb   [ label = "Return changed rows' primary keys" ];
+    ctxb=>objb [ label = "Fault the corresponding object" ];
+    ...;
+    ...;
+    b=>objb    [ label = "-primitiveValueForKey:" ];
+    objb=>ctxb [ label = "Fire the fault" ];
+    ctxb=>db   [ label = "Send a SELECT query" ];
+    db>>ctxb   [ label = "Return the corresponding row" ];
+    ctxb=>objb [ label = "Cache the received values" ];
+    objb>>b    [ label = "Return the value" ];
+}

Documentation/images/BaseTen-class-hierarchy.pdf

Binary file removed.

Documentation/images/BaseTen-class-hierarchy.png

Removed
Old image

Documentation/images/BaseTen-object-relationships.pdf

Binary file removed.

Documentation/images/BaseTen-object-relationships.png

Removed
Old image

Documentation/images/class-hierarchy.pdf

Binary file added.

Documentation/images/class-hierarchy.png

Added
New image

Documentation/images/connect.eps

+%!PS-Adobe-3.0 EPSF-2.0
+%%BoundingBox: 0 0 630.000000 242.899994
+%%Creator: mscgen 0.17
+%%EndComments
+0.700000 0.700000 scale
+0 0 moveto
+0 347 lineto
+900 347 lineto
+900 0 lineto
+closepath
+clip
+%PageTrailer
+%Page: 1 1
+/Helvetica findfont
+10 scalefont
+setfont
+/Helvetica findfont
+12 scalefont
+setfont
+0 347 translate
+/mtrx matrix def
+/ellipse
+  { /endangle exch def
+    /startangle exch def
+    /ydia exch def
+    /xdia exch def
+    /y exch def
+    /x exch def
+    /savematrix mtrx currentmatrix def
+    x y translate
+    xdia 2 div ydia 2 div scale
+    1 -1 scale
+    0 0 1 startangle endangle arc
+    savematrix setmatrix
+} def
+150 -15 moveto (Delegate) dup stringwidth pop 2 div neg 0 rmoveto show
+450 -15 moveto (Database context) dup stringwidth pop 2 div neg 0 rmoveto show
+750 -15 moveto (Connector) dup stringwidth pop 2 div neg 0 rmoveto show
+newpath 150 -22 moveto 150 -47 lineto stroke
+newpath 450 -22 moveto 450 -47 lineto stroke
+newpath 750 -22 moveto 750 -47 lineto stroke
+newpath 150 -34 moveto 450 -34 lineto stroke
+newpath 450 -34 moveto 440 -40 lineto 440 -28 lineto closepath fill
+276 -32 moveto (-connect:) show
+newpath 150 -47 moveto 150 -72 lineto stroke
+newpath 450 -47 moveto 450 -72 lineto stroke
+newpath 750 -47 moveto 750 -72 lineto stroke
+newpath 450 -59 moveto 750 -59 lineto stroke
+newpath 750 -59 moveto 740 -65 lineto stroke
+533 -57 moveto (Begin connection attempt) show
+newpath 150 -72 moveto 150 -97 lineto stroke
+newpath 450 -72 moveto 450 -97 lineto stroke
+newpath 750 -72 moveto 750 -97 lineto stroke
+newpath 750 -84 300 12 270 90 ellipse stroke
+newpath 750 -90 moveto 760 -96 lineto stroke
+615 -82 moveto (Display connection panel) show
+[2] 0 setdash
+newpath 150 -97 moveto 150 -122 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 450 -97 moveto 450 -122 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 750 -97 moveto 750 -122 lineto stroke
+[] 0 setdash
+385 -112 moveto (User sets the host name) show
+[2] 0 setdash
+newpath 150 -122 moveto 150 -147 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 450 -122 moveto 450 -147 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 750 -122 moveto 750 -147 lineto stroke
+[] 0 setdash
+newpath 150 -147 moveto 150 -172 lineto stroke
+newpath 450 -147 moveto 450 -172 lineto stroke
+newpath 750 -147 moveto 750 -172 lineto stroke
+newpath 750 -159 moveto 150 -159 lineto stroke
+newpath 150 -159 moveto 160 -165 lineto stroke
+newpath 150 -159 moveto 160 -153 lineto stroke
+356 -157 moveto (-databaseContextGotDatabaseURI:) show
+newpath 150 -172 moveto 150 -197 lineto stroke
+newpath 450 -172 moveto 450 -197 lineto stroke
+newpath 750 -172 moveto 750 -197 lineto stroke
+newpath 150 -184 300 12 90 270 ellipse stroke
+newpath 150 -190 moveto 140 -196 lineto stroke
+152 -182 moveto (Prepare entities) show
+newpath 150 -197 moveto 150 -222 lineto stroke
+newpath 450 -197 moveto 450 -222 lineto stroke
+newpath 750 -197 moveto 750 -222 lineto stroke
+[2] 0 setdash
+newpath 150 -209 moveto 750 -209 lineto stroke
+[] 0 setdash
+newpath 750 -209 moveto 740 -215 lineto 740 -203 lineto closepath fill
+newpath 150 -222 moveto 150 -247 lineto stroke
+newpath 450 -222 moveto 450 -247 lineto stroke
+newpath 750 -222 moveto 750 -247 lineto stroke
+newpath 750 -234 300 12 270 90 ellipse stroke
+newpath 750 -240 moveto 760 -246 lineto stroke
+639 -232 moveto (Continue connecting) show
+[2] 0 setdash
+newpath 150 -247 moveto 150 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 450 -247 moveto 450 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 750 -247 moveto 750 -272 lineto stroke
+[] 0 setdash
+377 -262 moveto (Connection gets negotiated) show
+[2] 0 setdash
+newpath 150 -272 moveto 150 -297 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 450 -272 moveto 450 -297 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 750 -272 moveto 750 -297 lineto stroke
+[] 0 setdash
+newpath 150 -297 moveto 150 -322 lineto stroke
+newpath 450 -297 moveto 450 -322 lineto stroke
+newpath 750 -297 moveto 750 -322 lineto stroke
+376 -312 moveto (Connection attempt finished) show
+[2] 0 setdash
+newpath 75 -309 moveto 374 -309 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 526 -309 moveto 825 -309 lineto stroke
+[] 0 setdash
+newpath 150 -322 moveto 150 -347 lineto stroke
+newpath 450 -322 moveto 450 -347 lineto stroke
+newpath 750 -322 moveto 750 -347 lineto stroke
+newpath 750 -334 moveto 150 -334 lineto stroke
+newpath 150 -334 moveto 160 -340 lineto stroke
+newpath 150 -334 moveto 160 -328 lineto stroke
+238 -332 moveto (-databaseContextConnectionSucceeded: or -databaseContext:failedToConnect:) show

Documentation/images/connect.png

Added
New image

Documentation/images/object-relationships.pdf

Binary file added.

Documentation/images/object-relationships.png

Added
New image

Documentation/images/update-change-propagation.eps

+%!PS-Adobe-3.0 EPSF-2.0
+%%BoundingBox: 0 0 1259.299927 295.399994
+%%Creator: mscgen 0.17
+%%EndComments
+0.700000 0.700000 scale
+0 0 moveto
+0 422 lineto
+1799 422 lineto
+1799 0 lineto
+closepath
+clip
+%PageTrailer
+%Page: 1 1
+/Helvetica findfont
+10 scalefont
+setfont
+/Helvetica findfont
+12 scalefont
+setfont
+0 422 translate
+/mtrx matrix def
+/ellipse
+  { /endangle exch def
+    /startangle exch def
+    /ydia exch def
+    /xdia exch def
+    /y exch def
+    /x exch def
+    /savematrix mtrx currentmatrix def
+    x y translate
+    xdia 2 div ydia 2 div scale
+    1 -1 scale
+    0 0 1 startangle endangle arc
+    savematrix setmatrix
+} def
+128 -15 moveto (Client A) dup stringwidth pop 2 div neg 0 rmoveto show
+385 -15 moveto (Database object) dup stringwidth pop 2 div neg 0 rmoveto show
+642 -15 moveto (A's Database context) dup stringwidth pop 2 div neg 0 rmoveto show
+899 -15 moveto (Database server) dup stringwidth pop 2 div neg 0 rmoveto show
+1156 -15 moveto (B's Database context) dup stringwidth pop 2 div neg 0 rmoveto show
+1413 -15 moveto (Database object) dup stringwidth pop 2 div neg 0 rmoveto show
+1670 -15 moveto (Client B) dup stringwidth pop 2 div neg 0 rmoveto show
+newpath 128 -22 moveto 128 -47 lineto stroke
+newpath 385 -22 moveto 385 -47 lineto stroke
+newpath 642 -22 moveto 642 -47 lineto stroke
+newpath 899 -22 moveto 899 -47 lineto stroke
+newpath 1156 -22 moveto 1156 -47 lineto stroke
+newpath 1413 -22 moveto 1413 -47 lineto stroke
+newpath 1670 -22 moveto 1670 -47 lineto stroke
+newpath 128 -34 moveto 385 -34 lineto stroke
+newpath 385 -34 moveto 375 -40 lineto 375 -28 lineto closepath fill
+188 -32 moveto (-setPrimitiveValue:forKey:) show
+newpath 128 -47 moveto 128 -72 lineto stroke
+newpath 385 -47 moveto 385 -72 lineto stroke
+newpath 642 -47 moveto 642 -72 lineto stroke
+newpath 899 -47 moveto 899 -72 lineto stroke
+newpath 1156 -47 moveto 1156 -72 lineto stroke
+newpath 1413 -47 moveto 1413 -72 lineto stroke
+newpath 1670 -47 moveto 1670 -72 lineto stroke
+newpath 385 -59 257 12 90 270 ellipse stroke
+newpath 385 -65 moveto 375 -71 lineto 375 -59 lineto closepath fill
+387 -57 moveto (Cache the given value) show
+newpath 128 -72 moveto 128 -97 lineto stroke
+newpath 385 -72 moveto 385 -97 lineto stroke
+newpath 642 -72 moveto 642 -97 lineto stroke
+newpath 899 -72 moveto 899 -97 lineto stroke
+newpath 1156 -72 moveto 1156 -97 lineto stroke
+newpath 1413 -72 moveto 1413 -97 lineto stroke
+newpath 1670 -72 moveto 1670 -97 lineto stroke
+newpath 385 -84 moveto 642 -84 lineto stroke
+newpath 642 -84 moveto 632 -90 lineto 632 -78 lineto closepath fill
+459 -82 moveto (Update the database) show
+newpath 128 -97 moveto 128 -122 lineto stroke
+newpath 385 -97 moveto 385 -122 lineto stroke
+newpath 642 -97 moveto 642 -122 lineto stroke
+newpath 899 -97 moveto 899 -122 lineto stroke
+newpath 1156 -97 moveto 1156 -122 lineto stroke
+newpath 1413 -97 moveto 1413 -122 lineto stroke
+newpath 1670 -97 moveto 1670 -122 lineto stroke
+newpath 642 -109 moveto 899 -109 lineto stroke
+newpath 899 -109 moveto 889 -115 lineto 889 -103 lineto closepath fill
+705 -107 moveto (Send the UPDATE query) show
+newpath 128 -122 moveto 128 -147 lineto stroke
+newpath 385 -122 moveto 385 -147 lineto stroke
+newpath 642 -122 moveto 642 -147 lineto stroke
+newpath 899 -122 moveto 899 -147 lineto stroke
+newpath 1156 -122 moveto 1156 -147 lineto stroke
+newpath 1413 -122 moveto 1413 -147 lineto stroke
+newpath 1670 -122 moveto 1670 -147 lineto stroke
+newpath 899 -134 moveto 1156 -134 lineto stroke
+newpath 1156 -134 moveto 1146 -140 lineto 1146 -128 lineto closepath fill
+897 -132 moveto (Notify the other clients about rows being changed) show
+newpath 128 -147 moveto 128 -172 lineto stroke
+newpath 385 -147 moveto 385 -172 lineto stroke
+newpath 642 -147 moveto 642 -172 lineto stroke
+newpath 899 -147 moveto 899 -172 lineto stroke
+newpath 1156 -147 moveto 1156 -172 lineto stroke
+newpath 1413 -147 moveto 1413 -172 lineto stroke
+newpath 1670 -147 moveto 1670 -172 lineto stroke
+newpath 1156 -159 moveto 899 -159 lineto stroke
+newpath 899 -159 moveto 909 -165 lineto 909 -153 lineto closepath fill
+968 -157 moveto (Send a SELECT query) show
+newpath 128 -172 moveto 128 -197 lineto stroke
+newpath 385 -172 moveto 385 -197 lineto stroke
+newpath 642 -172 moveto 642 -197 lineto stroke
+newpath 899 -172 moveto 899 -197 lineto stroke
+newpath 1156 -172 moveto 1156 -197 lineto stroke
+newpath 1413 -172 moveto 1413 -197 lineto stroke
+newpath 1670 -172 moveto 1670 -197 lineto stroke
+[2] 0 setdash
+newpath 899 -184 moveto 1156 -184 lineto stroke
+[] 0 setdash
+newpath 1156 -184 moveto 1146 -190 lineto 1146 -178 lineto closepath fill
+934 -182 moveto (Return changed rows' primary keys) show
+newpath 128 -197 moveto 128 -222 lineto stroke
+newpath 385 -197 moveto 385 -222 lineto stroke
+newpath 642 -197 moveto 642 -222 lineto stroke
+newpath 899 -197 moveto 899 -222 lineto stroke
+newpath 1156 -197 moveto 1156 -222 lineto stroke
+newpath 1413 -197 moveto 1413 -222 lineto stroke
+newpath 1670 -197 moveto 1670 -222 lineto stroke
+newpath 1156 -209 moveto 1413 -209 lineto stroke
+newpath 1413 -209 moveto 1403 -215 lineto 1403 -203 lineto closepath fill
+1205 -207 moveto (Fault the corresponding object) show
+[2] 0 setdash
+newpath 128 -222 moveto 128 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 385 -222 moveto 385 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 642 -222 moveto 642 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 899 -222 moveto 899 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1156 -222 moveto 1156 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1413 -222 moveto 1413 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1670 -222 moveto 1670 -247 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 128 -247 moveto 128 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 385 -247 moveto 385 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 642 -247 moveto 642 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 899 -247 moveto 899 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1156 -247 moveto 1156 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1413 -247 moveto 1413 -272 lineto stroke
+[] 0 setdash
+[2] 0 setdash
+newpath 1670 -247 moveto 1670 -272 lineto stroke
+[] 0 setdash
+newpath 128 -272 moveto 128 -297 lineto stroke
+newpath 385 -272 moveto 385 -297 lineto stroke
+newpath 642 -272 moveto 642 -297 lineto stroke
+newpath 899 -272 moveto 899 -297 lineto stroke
+newpath 1156 -272 moveto 1156 -297 lineto stroke
+newpath 1413 -272 moveto 1413 -297 lineto stroke
+newpath 1670 -272 moveto 1670 -297 lineto stroke
+newpath 1670 -284 moveto 1413 -284 lineto stroke
+newpath 1413 -284 moveto 1423 -290 lineto 1423 -278 lineto closepath fill
+1482 -282 moveto (-primitiveValueForKey:) show
+newpath 128 -297 moveto 128 -322 lineto stroke
+newpath 385 -297 moveto 385 -322 lineto stroke
+newpath 642 -297 moveto 642 -322 lineto stroke
+newpath 899 -297 moveto 899 -322 lineto stroke
+newpath 1156 -297 moveto 1156 -322 lineto stroke
+newpath 1413 -297 moveto 1413 -322 lineto stroke
+newpath 1670 -297 moveto 1670 -322 lineto stroke
+newpath 1413 -309 moveto 1156 -309 lineto stroke
+newpath 1156 -309 moveto 1166 -315 lineto 1166 -303 lineto closepath fill
+1252 -307 moveto (Fire the fault) show
+newpath 128 -322 moveto 128 -347 lineto stroke
+newpath 385 -322 moveto 385 -347 lineto stroke
+newpath 642 -322 moveto 642 -347 lineto stroke
+newpath 899 -322 moveto 899 -347 lineto stroke
+newpath 1156 -322 moveto 1156 -347 lineto stroke
+newpath 1413 -322 moveto 1413 -347 lineto stroke
+newpath 1670 -322 moveto 1670 -347 lineto stroke
+newpath 1156 -334 moveto 899 -334 lineto stroke
+newpath 899 -334 moveto 909 -340 lineto 909 -328 lineto closepath fill
+968 -332 moveto (Send a SELECT query) show
+newpath 128 -347 moveto 128 -372 lineto stroke
+newpath 385 -347 moveto 385 -372 lineto stroke
+newpath 642 -347 moveto 642 -372 lineto stroke
+newpath 899 -347 moveto 899 -372 lineto stroke
+newpath 1156 -347 moveto 1156 -372 lineto stroke
+newpath 1413 -347 moveto 1413 -372 lineto stroke
+newpath 1670 -347 moveto 1670 -372 lineto stroke
+[2] 0 setdash
+newpath 899 -359 moveto 1156 -359 lineto stroke
+[] 0 setdash
+newpath 1156 -359 moveto 1146 -365 lineto 1146 -353 lineto closepath fill
+949 -357 moveto (Return the corresponding row) show
+newpath 128 -372 moveto 128 -397 lineto stroke
+newpath 385 -372 moveto 385 -397 lineto stroke
+newpath 642 -372 moveto 642 -397 lineto stroke
+newpath 899 -372 moveto 899 -397 lineto stroke
+newpath 1156 -372 moveto 1156 -397 lineto stroke
+newpath 1413 -372 moveto 1413 -397 lineto stroke
+newpath 1670 -372 moveto 1670 -397 lineto stroke
+newpath 1156 -384 moveto 1413 -384 lineto stroke
+newpath 1413 -384 moveto 1403 -390 lineto 1403 -378 lineto closepath fill
+1215 -382 moveto (Cache the received values) show
+newpath 128 -397 moveto 128 -422 lineto stroke
+newpath 385 -397 moveto 385 -422 lineto stroke
+newpath 642 -397 moveto 642 -422 lineto stroke
+newpath 899 -397 moveto 899 -422 lineto stroke
+newpath 1156 -397 moveto 1156 -422 lineto stroke
+newpath 1413 -397 moveto 1413 -422 lineto stroke
+newpath 1670 -397 moveto 1670 -422 lineto stroke
+[2] 0 setdash
+newpath 1413 -409 moveto 1670 -409 lineto stroke
+[] 0 setdash
+newpath 1670 -409 moveto 1660 -415 lineto 1660 -403 lineto closepath fill
+1498 -407 moveto (Return the value) show

Documentation/images/update-change-propagation.png

Added
New image