Added fn:contains and fn:ends-with. Optimized fn:starts-with.
authorFrederic Jolliton <frederic@jolliton.com>
Wed, 7 Sep 2005 23:20:23 +0000 (23:20 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Wed, 7 Sep 2005 23:20:23 +0000 (23:20 +0000)
git-archimport-id: frederic@jolliton.com--2005-main/tx--main--0.1--patch-10

xpathfn.py

index 3712cdd..0e26a4e 100644 (file)
@@ -560,9 +560,52 @@ def fnStartsWith( context , arg1 , arg2 , collation = None ) :
        if collation is not None :
                raise XError( 'FOCH0004' , 'Collation not supported' )
        arg1 = zeroOrOneItem( arg1 )
+       if arg1 is None :
+               arg1 = ''
        arg2 = zeroOrOneItem( arg2 )
-       return _Boolean[ _startsWith( asStringOrStream( arg1 ) ,
-                                                                 asStringOrStream( arg2 ) ) ]
+       if arg2 is None :
+               arg2 = ''
+       if arg1 is arg2 :
+               return _True
+       else :
+               return _Boolean[ _startsWith( asStringOrStream( arg1 ) ,
+                                                                         asStringOrStream( arg2 ) ) ]
+
+@registerFast( 'fn:ends-with' )
+def fnEndsWith( context , arg1 , arg2 , collation = None ) :
+
+       if collation is not None :
+               raise XError( 'FOCH0004' , 'Collation not supported' )
+       arg1 = zeroOrOneItem( arg1 )
+       if arg1 is None :
+               arg1 = ''
+       arg2 = zeroOrOneItem( arg2 )
+       if arg2 is None :
+               arg2 = ''
+       if arg1 is arg2 or arg2 == '' :
+               return _True
+       elif arg1 == '' :
+               return _False
+       else :
+               return _Boolean[ asString( arg1 ).endswith( asString( arg2 ) ) ]
+
+@registerFast( 'fn:contains' )
+def fnContains( context , arg1 , arg2 , collation = None ) :
+
+       if collation is not None :
+               raise XError( 'FOCH0004' , 'Collation not supported' )
+       arg1 = zeroOrOneItem( arg1 )
+       if arg1 is None :
+               arg1 = ''
+       arg2 = zeroOrOneItem( arg2 )
+       if arg2 is None :
+               arg2 = ''
+       if arg1 is arg2 and arg2 == '' :
+               return _True
+       elif arg1 == '' :
+               return _False
+       else :
+               return _Boolean[ asString( arg2 ) in asString( arg1 ) ]
 
 #----------------------------------------------------------------------------