Skip to content

Commit 25ce954

Browse files
authored
Suspended promise tree (#209)
* Refactored chart rendering using "suspended promise tree" approach * Promise thunk refactoring * View thunk refactoring * Object block loading fixed * Fixed query view mode * Fixed view navigation * ldh:view-object-metadata-thunk
1 parent 1090b6d commit 25ce954

File tree

6 files changed

+539
-230
lines changed

6 files changed

+539
-230
lines changed

src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ exclude-result-prefixes="#all"
120120
<xsl:template match="*" mode="ldh:RenderRow">
121121
<xsl:apply-templates mode="#current"/>
122122
</xsl:template>
123+
124+
<xsl:template match="text()" mode="ldh:RenderRow"/>
123125

124126
<!-- hide type control -->
125127
<xsl:template match="*[rdf:type/@rdf:resource = '&ldh;XHTML']" mode="bs2:TypeControl" priority="1">
@@ -318,6 +320,46 @@ exclude-result-prefixes="#all"
318320

319321
<!-- CALLBACKS -->
320322

323+
<xsl:function name="ldh:load-block" ixsl:updating="yes" as="map(*)">
324+
<xsl:param name="context" as="map(*)"/>
325+
<xsl:param name="self-thunk" as="function(map(*)) as item()*"/>
326+
<xsl:param name="child-thunk" as="function(map(*)) as item()*?"/>
327+
<xsl:param name="ignored" as="item()?"/>
328+
329+
<xsl:sequence select="
330+
ixsl:all-settled(
331+
array{
332+
$self-thunk($context),
333+
if ($child-thunk) then $child-thunk($context) else ()
334+
}
335+
)
336+
=> ixsl:then(
337+
ldh:hide-block-progress-bar(
338+
$context,
339+
?
340+
)
341+
)
342+
"/>
343+
</xsl:function>
344+
345+
<xsl:function name="ldh:hide-block-progress-bar" as="map(*)" ixsl:updating="yes">
346+
<xsl:param name="context" as="map(*)"/>
347+
<xsl:param name="results" as="array(*)"/>
348+
349+
<xsl:variable name="container" select="$context('container')" as="element()"/>
350+
351+
<xsl:message>ldh:hide-block-progress-bar $container/@typeof: <xsl:value-of select="$container/@typeof"/></xsl:message>
352+
353+
<!-- hide the progress bar -->
354+
<xsl:for-each select="$container/ancestor::div[contains-token(@class, 'span12')][contains-token(@class, 'progress')][contains-token(@class, 'active')]">
355+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress', false() ])[current-date() lt xs:date('2000-01-01')]"/>
356+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress-striped', false() ])[current-date() lt xs:date('2000-01-01')]"/>
357+
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'active', false() ])[current-date() lt xs:date('2000-01-01')]"/>
358+
</xsl:for-each>
359+
360+
<xsl:sequence select="$context"/>
361+
</xsl:function>
362+
321363
<!-- block delete -->
322364

323365
<xsl:template name="onBlockDelete">

src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/chart.xsl

Lines changed: 103 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ exclude-result-prefixes="#all"
203203
</xsl:template>
204204

205205
<!-- render chart block -->
206-
<xsl:template match="*[@typeof = ('&ldh;ResultSetChart', '&ldh;GraphChart')][descendant::*[@property = '&spin;query'][@resource]][descendant::*[@property = '&ldh;chartType'][@resource]]" mode="ldh:RenderRow" priority="2"> <!-- prioritize above block.xsl -->
206+
207+
<xsl:template match="*[@typeof = ('&ldh;ResultSetChart', '&ldh;GraphChart')][descendant::*[@property = '&spin;query'][@resource]][descendant::*[@property = '&ldh;chartType'][@resource]]" mode="ldh:RenderRow" as="function(item()?) as map(*)" priority="2"> <!-- prioritize above block.xsl -->
207208
<xsl:param name="block" select="ancestor-or-self::div[contains-token(@class, 'block')][1]" as="element()"/>
208209
<xsl:param name="about" select="$block/@about" as="xs:anyURI"/>
209210
<xsl:param name="container" select="." as="element()"/>
@@ -240,6 +241,97 @@ exclude-result-prefixes="#all"
240241
<ixsl:set-style name="width" select="'66%'" object="."/>
241242
</xsl:for-each>
242243

244+
<xsl:variable name="child-thunk" as="function(map(*)) as item()*?">
245+
<xsl:apply-templates mode="#current"/>
246+
</xsl:variable>
247+
248+
<xsl:variable name="request-uri" select="ldh:href($ldt:base, ac:absolute-path(ldh:base-uri(.)), map{}, $query-uri)" as="xs:anyURI"/>
249+
<xsl:variable name="request" select="map{ 'method': 'GET', 'href': $request-uri, 'headers': map{ 'Accept': 'application/rdf+xml' } }" as="map(*)"/>
250+
<xsl:variable name="context" as="map(*)" select="
251+
map{
252+
'request': $request,
253+
'this': $about,
254+
'block': $block,
255+
'container': $container,
256+
'container-id': $container-id,
257+
'method': $method,
258+
'action': $action,
259+
'accept-charset': $accept-charset,
260+
'enctype': $enctype,
261+
'chart-type-id': $chart-type-id,
262+
'category-id': $category-id,
263+
'series-id': $series-id,
264+
'query-uri': $query-uri,
265+
'chart-type': $chart-type,
266+
'category': $category,
267+
'series': $series,
268+
'canvas-id': $canvas-id,
269+
'canvas-class': $canvas-class,
270+
'form-actions': $form-actions
271+
}"/>
272+
273+
<xsl:sequence select="
274+
ldh:load-block#4(
275+
$context,
276+
ldh:chart-self-thunk#1,
277+
$child-thunk,
278+
?
279+
)
280+
"/>
281+
</xsl:template>
282+
283+
<!-- this is the one thunk you hand to load-block#4 -->
284+
<xsl:function name="ldh:chart-self-thunk" as="item()*" ixsl:updating="yes">
285+
<xsl:param name="context" as="map(*)"/>
286+
<xsl:message>ldh:chart-self-thunk</xsl:message>
287+
<xsl:sequence select="
288+
ixsl:resolve($context) =>
289+
ixsl:then(ldh:render-chart#1) =>
290+
ixsl:then(ldh:chart-query-thunk#1) =>
291+
ixsl:then(ldh:chart-results-thunk#1)
292+
"/>
293+
</xsl:function>
294+
295+
<!-- only the first HTTP → query‐response lives here -->
296+
<xsl:function name="ldh:chart-query-thunk" as="item()*" ixsl:updating="yes">
297+
<xsl:param name="context" as="map(*)"/>
298+
<xsl:message>ldh:chart-query-thunk</xsl:message>
299+
<xsl:sequence select="
300+
ixsl:http-request($context('request')) =>
301+
ixsl:then(ldh:rethread-response($context, ?)) =>
302+
ixsl:then(ldh:handle-response#1) =>
303+
ixsl:then(ldh:chart-query-response#1)
304+
"/>
305+
</xsl:function>
306+
307+
<xsl:function name="ldh:chart-results-thunk" as="item()*" ixsl:updating="yes">
308+
<xsl:param name="context" as="map(*)"/>
309+
<xsl:message>ldh:chart-results-thunk</xsl:message>
310+
<xsl:sequence select="
311+
ixsl:http-request($context('request')) =>
312+
ixsl:then(ldh:rethread-response($context, ?)) =>
313+
ixsl:then(ldh:handle-response#1) =>
314+
ixsl:then(ldh:chart-results-response#1)
315+
"/>
316+
</xsl:function>
317+
318+
<xsl:function name="ldh:render-chart" ixsl:updating="yes">
319+
<xsl:param name="context" as="map(*)"/>
320+
<xsl:variable name="container" select="$context('container')" as="element()"/>
321+
<xsl:variable name="method" select="$context('method')" as="xs:string"/>
322+
<xsl:variable name="action" select="$context('action')" as="xs:anyURI"/>
323+
<xsl:variable name="accept-charset" select="$context('accept-charset')" as="xs:string?"/>
324+
<xsl:variable name="enctype" select="$context('enctype')" as="xs:string?"/>
325+
<xsl:variable name="chart-type-id" select="$context('chart-type-id')" as="xs:string"/>
326+
<xsl:variable name="category-id" select="$context('category-id')" as="xs:string"/>
327+
<xsl:variable name="series-id" select="$context('series-id')" as="xs:string"/>
328+
<xsl:variable name="chart-type" select="$context('chart-type')" as="xs:anyURI?"/>
329+
<xsl:variable name="canvas-id" select="$context('canvas-id')" as="xs:string?"/>
330+
<xsl:variable name="canvas-class" select="$context('canvas-class')" as="xs:string?"/>
331+
<xsl:variable name="form-actions" select="$context('form-actions')" as="element()?"/>
332+
333+
<xsl:message>ldh:render-chart</xsl:message>
334+
243335
<xsl:for-each select="$container//div[contains-token(@class, 'main')]">
244336
<xsl:variable name="header" select="./div/div[@class = 'well']" as="element()"/>
245337

@@ -325,28 +417,9 @@ exclude-result-prefixes="#all"
325417
</form>
326418
</xsl:result-document>
327419
</xsl:for-each>
328-
329-
<xsl:variable name="request-uri" select="ldh:href($ldt:base, ac:absolute-path(ldh:base-uri(.)), map{}, $query-uri)" as="xs:anyURI"/>
330-
<xsl:variable name="request" select="map{ 'method': 'GET', 'href': $request-uri, 'headers': map{ 'Accept': 'application/rdf+xml' } }" as="map(*)"/>
331-
<xsl:variable name="context" as="map(*)" select="
332-
map{
333-
'request': $request,
334-
'this': $about,
335-
'block': $block,
336-
'container': $container,
337-
'container-id': $container-id,
338-
'query-uri': $query-uri,
339-
'chart-type': $chart-type,
340-
'category': $category,
341-
'series': $series,
342-
'canvas-id': $canvas-id
343-
}"/>
344-
<ixsl:promise select="ixsl:http-request($context('request')) =>
345-
ixsl:then(ldh:rethread-response($context, ?)) =>
346-
ixsl:then(ldh:handle-response#1) =>
347-
ixsl:then(ldh:chart-query-response#1)"
348-
on-failure="ldh:promise-failure#1"/>
349-
</xsl:template>
420+
421+
<xsl:sequence select="$context"/>
422+
</xsl:function>
350423

351424
<!-- EVENT LISTENERS -->
352425

@@ -576,6 +649,8 @@ exclude-result-prefixes="#all"
576649
<xsl:variable name="series" select="$context('series')" as="xs:string*"/>
577650
<xsl:variable name="canvas-id" select="$context('canvas-id')" as="xs:string"/>
578651

652+
<xsl:message>ldh:chart-query-response</xsl:message>
653+
579654
<xsl:for-each select="$response">
580655
<xsl:variable name="response" select="." as="map(*)"/>
581656
<xsl:choose>
@@ -597,7 +672,7 @@ exclude-result-prefixes="#all"
597672
</xsl:for-each>
598673

599674
<xsl:variable name="request" select="map{ 'method': 'GET', 'href': $request-uri, 'headers': map{ 'Accept': 'application/sparql-results+xml,application/rdf+xml;q=0.9' } }" as="map(*)"/>
600-
<xsl:variable name="context" as="map(*)" select="
675+
<xsl:sequence select="
601676
map{
602677
'request': $request,
603678
'endpoint': $endpoint,
@@ -613,11 +688,6 @@ exclude-result-prefixes="#all"
613688
'show-chart-save': false(),
614689
'results-container-id': $container-id || '-query-results'
615690
}"/>
616-
<ixsl:promise select="ixsl:http-request($context('request')) =>
617-
ixsl:then(ldh:rethread-response($context, ?)) =>
618-
ixsl:then(ldh:handle-response#1) =>
619-
ixsl:then(ldh:chart-results-response#1)"
620-
on-failure="ldh:promise-failure#1"/>
621691
</xsl:for-each>
622692
</xsl:when>
623693
<xsl:otherwise>
@@ -639,11 +709,11 @@ exclude-result-prefixes="#all"
639709
</div>
640710
</xsl:result-document>
641711
</xsl:for-each>
712+
713+
<xsl:sequence select="$context"/>
642714
</xsl:otherwise>
643715
</xsl:choose>
644716
</xsl:for-each>
645-
646-
<xsl:sequence select="$context"/>
647717
</xsl:function>
648718

649719
<!-- SPARQL results response -->
@@ -664,6 +734,8 @@ exclude-result-prefixes="#all"
664734
<xsl:variable name="show-chart-save" select="$context('show-chart-save')" as="xs:boolean"/>
665735
<xsl:variable name="results-container-id" select="$context('results-container-id')" as="xs:string"/>
666736

737+
<xsl:message>ldh:chart-results-response</xsl:message>
738+
667739
<xsl:for-each select="$response">
668740
<ixsl:set-style name="cursor" select="'default'" object="ixsl:page()//body"/>
669741

@@ -694,23 +766,9 @@ exclude-result-prefixes="#all"
694766
<xsl:with-param name="category" select="$category"/>
695767
<xsl:with-param name="series" select="$series"/>
696768
</xsl:call-template>
697-
698-
<!-- hide the progress bar - either of this block (if it contains a progress bar) or of the parent block -->
699-
<xsl:for-each select="($block//div[contains-token(@class, 'span12')][contains-token(@class, 'progress')][contains-token(@class, 'active')], $block/ancestor::div[contains-token(@class, 'block')]//div[contains-token(@class, 'span12')][contains-token(@class, 'progress')][contains-token(@class, 'active')])[1]">
700-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress', false() ])[current-date() lt xs:date('2000-01-01')]"/>
701-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress-striped', false() ])[current-date() lt xs:date('2000-01-01')]"/>
702-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'active', false() ])[current-date() lt xs:date('2000-01-01')]"/>
703-
</xsl:for-each>
704769
</xsl:for-each>
705770
</xsl:when>
706771
<xsl:otherwise>
707-
<!-- hide the progress bar - either of this block (if it contains a progress bar) or of the parent block -->
708-
<xsl:for-each select="($block//div[contains-token(@class, 'span12')][contains-token(@class, 'progress')][contains-token(@class, 'active')], $block/ancestor::div[contains-token(@class, 'block')]//div[contains-token(@class, 'span12')][contains-token(@class, 'progress')][contains-token(@class, 'active')])[1]">
709-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress', false() ])[current-date() lt xs:date('2000-01-01')]"/>
710-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'progress-striped', false() ])[current-date() lt xs:date('2000-01-01')]"/>
711-
<xsl:sequence select="ixsl:call(ixsl:get(., 'classList'), 'toggle', [ 'active', false() ])[current-date() lt xs:date('2000-01-01')]"/>
712-
</xsl:for-each>
713-
714772
<!-- error response - could not load query results -->
715773
<xsl:for-each select="$container">
716774
<xsl:result-document href="?." method="ixsl:replace-content">

0 commit comments

Comments
 (0)