xpath/trunk/XMLv2__XPathExpressionOptimizer.st
changeset 0 5057afe1ec87
equal deleted inserted replaced
-1:000000000000 0:5057afe1ec87
       
     1 "{ Package: 'stx:goodies/xmlsuite/xpath' }"
       
     2 
       
     3 "{ NameSpace: XMLv2 }"
       
     4 
       
     5 Object subclass:#XPathExpressionOptimizer
       
     6 	instanceVariableNames:'xpathExpression'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'XML Suite-XPath'
       
    10 !
       
    11 
       
    12 
       
    13 !XPathExpressionOptimizer class methodsFor:'optimizer'!
       
    14 
       
    15 optimize: xpathExpression
       
    16 
       
    17     ^self new
       
    18         xpathExpression: xpathExpression;
       
    19         optimize;
       
    20         xpathExpression
       
    21 
       
    22     "Created: / 21-11-2007 / 10:43:43 / janfrog"
       
    23 ! !
       
    24 
       
    25 !XPathExpressionOptimizer methodsFor:'accessing'!
       
    26 
       
    27 xpathExpression
       
    28     ^ xpathExpression
       
    29 
       
    30     "Created: / 21-11-2007 / 10:43:48 / janfrog"
       
    31 !
       
    32 
       
    33 xpathExpression:something
       
    34     xpathExpression := something.
       
    35 
       
    36     "Created: / 21-11-2007 / 10:43:48 / janfrog"
       
    37 ! !
       
    38 
       
    39 !XPathExpressionOptimizer methodsFor:'optimizing'!
       
    40 
       
    41 optimize
       
    42 
       
    43     self optimizeDescendantOrSelf
       
    44 
       
    45     "Created: / 21-11-2007 / 10:45:04 / janfrog"
       
    46 !
       
    47 
       
    48 optimizeDescendantOrSelf
       
    49 
       
    50     | newXPathExpression locationStepIndex |
       
    51     xpathExpression size < 1 ifTrue:[^self].
       
    52     newXPathExpression := XPathExpression new absolute: xpathExpression absolute.
       
    53     locationStepIndex := 1.
       
    54 
       
    55     [locationStepIndex < xpathExpression size] whileTrue:
       
    56         [| currentLocationStep nextLocationStep |
       
    57         currentLocationStep := xpathExpression at:locationStepIndex.
       
    58         nextLocationStep := xpathExpression at:locationStepIndex + 1.
       
    59         (currentLocationStep isDescendantOrSelfWithAnyKindTestStepAndWithoutPredicates
       
    60             and:[nextLocationStep isChildWithNameTestStep])
       
    61                 ifTrue:
       
    62                     [newXPathExpression add:
       
    63                         (XPathLocationStep new
       
    64                             axis: XPathAxisDescendantOrSelf new;
       
    65                             nodeTest: nextLocationStep nodeTest;
       
    66                             predicates: nextLocationStep predicates).
       
    67                     locationStepIndex := locationStepIndex + 1]
       
    68                 ifFalse:
       
    69                     [newXPathExpression
       
    70                         add: currentLocationStep].
       
    71         locationStepIndex := locationStepIndex + 1].
       
    72     locationStepIndex = xpathExpression size ifTrue:
       
    73         [newXPathExpression add:xpathExpression last].
       
    74     xpathExpression := newXPathExpression
       
    75 
       
    76     "Created: / 21-11-2007 / 11:02:49 / janfrog"
       
    77 ! !
       
    78 
       
    79 !XPathExpressionOptimizer class methodsFor:'documentation'!
       
    80 
       
    81 version
       
    82     ^ '$Header: /opt/data/cvs/stx/goodies/xmlsuite/xpath/XMLv2__XPathExpressionOptimizer.st,v 1.1 2007-11-22 21:47:19 vranyj1 Exp $'
       
    83 ! !