1*5153720fSfkaag71<?php 2*5153720fSfkaag71require_once('strataquerytest.inc.php'); 3*5153720fSfkaag71 4*5153720fSfkaag71/** 5*5153720fSfkaag71 * Tests queries - numeric optional operators. 6*5153720fSfkaag71 * 7*5153720fSfkaag71 * @group plugin_strata_optional 8*5153720fSfkaag71 * @group plugins 9*5153720fSfkaag71 */ 10*5153720fSfkaag71class query_operators_numeric_optional_test extends Strata_Query_UnitTestCase { 11*5153720fSfkaag71 12*5153720fSfkaag71 function setup() { 13*5153720fSfkaag71 parent::setup(); 14*5153720fSfkaag71 } 15*5153720fSfkaag71 16*5153720fSfkaag71 function testGtLtePartiallyNumeric() { 17*5153720fSfkaag71 $query = array ( 18*5153720fSfkaag71 'type' => 'select', 19*5153720fSfkaag71 'grouping'=>array(), 20*5153720fSfkaag71 'group' => array ( 21*5153720fSfkaag71 'type' => 'filter', 22*5153720fSfkaag71 'lhs' => array ( 23*5153720fSfkaag71 'type' => 'triple', 24*5153720fSfkaag71 'subject' => array ( 25*5153720fSfkaag71 'type' => 'variable', 26*5153720fSfkaag71 'text' => 'p' 27*5153720fSfkaag71 ), 28*5153720fSfkaag71 'predicate' => array ( 29*5153720fSfkaag71 'type' => 'literal', 30*5153720fSfkaag71 'text' => 'tax rate' 31*5153720fSfkaag71 ), 32*5153720fSfkaag71 'object' => array ( 33*5153720fSfkaag71 'type' => 'variable', 34*5153720fSfkaag71 'text' => 'tax' 35*5153720fSfkaag71 ) 36*5153720fSfkaag71 ), 37*5153720fSfkaag71 'rhs' => array ( 38*5153720fSfkaag71 array ( 39*5153720fSfkaag71 'type' => 'operator', 40*5153720fSfkaag71 'lhs' => array ( 41*5153720fSfkaag71 'type' => 'variable', 42*5153720fSfkaag71 'text' => 'tax' 43*5153720fSfkaag71 ), 44*5153720fSfkaag71 'operator' => '>', 45*5153720fSfkaag71 'rhs' => array ( 46*5153720fSfkaag71 'type' => 'literal', 47*5153720fSfkaag71 'text' => '2' 48*5153720fSfkaag71 ) 49*5153720fSfkaag71 ), 50*5153720fSfkaag71 array ( 51*5153720fSfkaag71 'type' => 'operator', 52*5153720fSfkaag71 'lhs' => array ( 53*5153720fSfkaag71 'type' => 'variable', 54*5153720fSfkaag71 'text' => 'tax' 55*5153720fSfkaag71 ), 56*5153720fSfkaag71 'operator' => '<=', 57*5153720fSfkaag71 'rhs' => array ( 58*5153720fSfkaag71 'type' => 'literal', 59*5153720fSfkaag71 'text' => '25' 60*5153720fSfkaag71 ) 61*5153720fSfkaag71 ) 62*5153720fSfkaag71 )), 63*5153720fSfkaag71 'projection' => array ( 64*5153720fSfkaag71 'p', 65*5153720fSfkaag71 'tax' 66*5153720fSfkaag71 ), 67*5153720fSfkaag71 'ordering' => array ( 68*5153720fSfkaag71 array ( 69*5153720fSfkaag71 'variable' => 'p', 70*5153720fSfkaag71 'direction' => 'asc' 71*5153720fSfkaag71 ) 72*5153720fSfkaag71 ) 73*5153720fSfkaag71 ); 74*5153720fSfkaag71 75*5153720fSfkaag71 $expected = array ( 76*5153720fSfkaag71 array ( 77*5153720fSfkaag71 'p' => array('person:alice'), 78*5153720fSfkaag71 'tax' => array('10%') 79*5153720fSfkaag71 ), 80*5153720fSfkaag71 array ( 81*5153720fSfkaag71 'p' => array('person:bob'), 82*5153720fSfkaag71 'tax' => array('25%') 83*5153720fSfkaag71 ) 84*5153720fSfkaag71 ); 85*5153720fSfkaag71 86*5153720fSfkaag71 $this->assertQueryResult($query, $expected, 'Partial numeric comparison (first numbers, then text) unsupported'); 87*5153720fSfkaag71 } 88*5153720fSfkaag71 89*5153720fSfkaag71 function testGteLtPartiallyNumeric() { 90*5153720fSfkaag71 $query = array ( 91*5153720fSfkaag71 'type' => 'select', 92*5153720fSfkaag71 'grouping'=>array(), 93*5153720fSfkaag71 'group' => array ( 94*5153720fSfkaag71 'type' => 'filter', 95*5153720fSfkaag71 'lhs' => array ( 96*5153720fSfkaag71 'type' => 'triple', 97*5153720fSfkaag71 'subject' => array ( 98*5153720fSfkaag71 'type' => 'variable', 99*5153720fSfkaag71 'text' => 'p' 100*5153720fSfkaag71 ), 101*5153720fSfkaag71 'predicate' => array ( 102*5153720fSfkaag71 'type' => 'literal', 103*5153720fSfkaag71 'text' => 'tax rate' 104*5153720fSfkaag71 ), 105*5153720fSfkaag71 'object' => array ( 106*5153720fSfkaag71 'type' => 'variable', 107*5153720fSfkaag71 'text' => 'tax' 108*5153720fSfkaag71 ) 109*5153720fSfkaag71 ), 110*5153720fSfkaag71 'rhs' => array ( 111*5153720fSfkaag71 array ( 112*5153720fSfkaag71 'type' => 'operator', 113*5153720fSfkaag71 'lhs' => array ( 114*5153720fSfkaag71 'type' => 'variable', 115*5153720fSfkaag71 'text' => 'tax' 116*5153720fSfkaag71 ), 117*5153720fSfkaag71 'operator' => '>=', 118*5153720fSfkaag71 'rhs' => array ( 119*5153720fSfkaag71 'type' => 'literal', 120*5153720fSfkaag71 'text' => '2' 121*5153720fSfkaag71 ) 122*5153720fSfkaag71 ), 123*5153720fSfkaag71 array ( 124*5153720fSfkaag71 'type' => 'operator', 125*5153720fSfkaag71 'lhs' => array ( 126*5153720fSfkaag71 'type' => 'variable', 127*5153720fSfkaag71 'text' => 'tax' 128*5153720fSfkaag71 ), 129*5153720fSfkaag71 'operator' => '<', 130*5153720fSfkaag71 'rhs' => array ( 131*5153720fSfkaag71 'type' => 'literal', 132*5153720fSfkaag71 'text' => '25' 133*5153720fSfkaag71 ) 134*5153720fSfkaag71 ) 135*5153720fSfkaag71 )), 136*5153720fSfkaag71 'projection' => array ( 137*5153720fSfkaag71 'p', 138*5153720fSfkaag71 'tax' 139*5153720fSfkaag71 ), 140*5153720fSfkaag71 'ordering' => array ( 141*5153720fSfkaag71 array ( 142*5153720fSfkaag71 'variable' => 'p', 143*5153720fSfkaag71 'direction' => 'asc' 144*5153720fSfkaag71 ) 145*5153720fSfkaag71 ) 146*5153720fSfkaag71 ); 147*5153720fSfkaag71 148*5153720fSfkaag71 $expected = array ( 149*5153720fSfkaag71 array ( 150*5153720fSfkaag71 'p' => array('person:alice'), 151*5153720fSfkaag71 'tax' => array('10%') 152*5153720fSfkaag71 ), 153*5153720fSfkaag71 array ( 154*5153720fSfkaag71 'p' => array('person:carol'), 155*5153720fSfkaag71 'tax' => array('2%') 156*5153720fSfkaag71 ) 157*5153720fSfkaag71 ); 158*5153720fSfkaag71 159*5153720fSfkaag71 $this->assertQueryResult($query, $expected, 'Partial numeric comparison (first numbers, then text) unsupported'); 160*5153720fSfkaag71 } 161*5153720fSfkaag71 162*5153720fSfkaag71 function testGtLteNatural() { 163*5153720fSfkaag71 $query = array ( 164*5153720fSfkaag71 'type' => 'select', 165*5153720fSfkaag71 'grouping'=>array(), 166*5153720fSfkaag71 'group' => array ( 167*5153720fSfkaag71 'type' => 'filter', 168*5153720fSfkaag71 'lhs' => array ( 169*5153720fSfkaag71 'type' => 'triple', 170*5153720fSfkaag71 'subject' => array ( 171*5153720fSfkaag71 'type' => 'variable', 172*5153720fSfkaag71 'text' => 'p' 173*5153720fSfkaag71 ), 174*5153720fSfkaag71 'predicate' => array ( 175*5153720fSfkaag71 'type' => 'literal', 176*5153720fSfkaag71 'text' => 'has length' 177*5153720fSfkaag71 ), 178*5153720fSfkaag71 'object' => array ( 179*5153720fSfkaag71 'type' => 'variable', 180*5153720fSfkaag71 'text' => 'length' 181*5153720fSfkaag71 ) 182*5153720fSfkaag71 ), 183*5153720fSfkaag71 'rhs' => array ( 184*5153720fSfkaag71 array ( 185*5153720fSfkaag71 'type' => 'operator', 186*5153720fSfkaag71 'lhs' => array ( 187*5153720fSfkaag71 'type' => 'variable', 188*5153720fSfkaag71 'text' => 'length' 189*5153720fSfkaag71 ), 190*5153720fSfkaag71 'operator' => '>', 191*5153720fSfkaag71 'rhs' => array ( 192*5153720fSfkaag71 'type' => 'literal', 193*5153720fSfkaag71 'text' => '4 ft' 194*5153720fSfkaag71 ) 195*5153720fSfkaag71 ), 196*5153720fSfkaag71 array ( 197*5153720fSfkaag71 'type' => 'operator', 198*5153720fSfkaag71 'lhs' => array ( 199*5153720fSfkaag71 'type' => 'variable', 200*5153720fSfkaag71 'text' => 'length' 201*5153720fSfkaag71 ), 202*5153720fSfkaag71 'operator' => '<=', 203*5153720fSfkaag71 'rhs' => array ( 204*5153720fSfkaag71 'type' => 'literal', 205*5153720fSfkaag71 'text' => '5 ft 5 in' 206*5153720fSfkaag71 ) 207*5153720fSfkaag71 ) 208*5153720fSfkaag71 )), 209*5153720fSfkaag71 'projection' => array ( 210*5153720fSfkaag71 'p', 211*5153720fSfkaag71 'length' 212*5153720fSfkaag71 ), 213*5153720fSfkaag71 'ordering' => array ( 214*5153720fSfkaag71 array ( 215*5153720fSfkaag71 'variable' => 'p', 216*5153720fSfkaag71 'direction' => 'asc' 217*5153720fSfkaag71 ) 218*5153720fSfkaag71 ) 219*5153720fSfkaag71 ); 220*5153720fSfkaag71 221*5153720fSfkaag71 $expected = array ( 222*5153720fSfkaag71 array ( 223*5153720fSfkaag71 'p' => array('person:alice'), 224*5153720fSfkaag71 'length' => array('5 ft 5 in') 225*5153720fSfkaag71 ), 226*5153720fSfkaag71 array ( 227*5153720fSfkaag71 'p' => array('person:carol'), 228*5153720fSfkaag71 'length' => array('4 ft 11 in') 229*5153720fSfkaag71 ) 230*5153720fSfkaag71 ); 231*5153720fSfkaag71 232*5153720fSfkaag71 $this->assertQueryResult($query, $expected, 'Natural comparison unsupported'); 233*5153720fSfkaag71 } 234*5153720fSfkaag71 235*5153720fSfkaag71 function testGteLtNatural() { 236*5153720fSfkaag71 $query = array ( 237*5153720fSfkaag71 'type' => 'select', 238*5153720fSfkaag71 'grouping'=>array(), 239*5153720fSfkaag71 'group' => array ( 240*5153720fSfkaag71 'type' => 'filter', 241*5153720fSfkaag71 'lhs' => array ( 242*5153720fSfkaag71 'type' => 'triple', 243*5153720fSfkaag71 'subject' => array ( 244*5153720fSfkaag71 'type' => 'variable', 245*5153720fSfkaag71 'text' => 'p' 246*5153720fSfkaag71 ), 247*5153720fSfkaag71 'predicate' => array ( 248*5153720fSfkaag71 'type' => 'literal', 249*5153720fSfkaag71 'text' => 'has length' 250*5153720fSfkaag71 ), 251*5153720fSfkaag71 'object' => array ( 252*5153720fSfkaag71 'type' => 'variable', 253*5153720fSfkaag71 'text' => 'length' 254*5153720fSfkaag71 ) 255*5153720fSfkaag71 ), 256*5153720fSfkaag71 'rhs' => array ( 257*5153720fSfkaag71 array ( 258*5153720fSfkaag71 'type' => 'operator', 259*5153720fSfkaag71 'lhs' => array ( 260*5153720fSfkaag71 'type' => 'variable', 261*5153720fSfkaag71 'text' => 'length' 262*5153720fSfkaag71 ), 263*5153720fSfkaag71 'operator' => '>=', 264*5153720fSfkaag71 'rhs' => array ( 265*5153720fSfkaag71 'type' => 'literal', 266*5153720fSfkaag71 'text' => '4 ft' 267*5153720fSfkaag71 ) 268*5153720fSfkaag71 ), 269*5153720fSfkaag71 array ( 270*5153720fSfkaag71 'type' => 'operator', 271*5153720fSfkaag71 'lhs' => array ( 272*5153720fSfkaag71 'type' => 'variable', 273*5153720fSfkaag71 'text' => 'length' 274*5153720fSfkaag71 ), 275*5153720fSfkaag71 'operator' => '<', 276*5153720fSfkaag71 'rhs' => array ( 277*5153720fSfkaag71 'type' => 'literal', 278*5153720fSfkaag71 'text' => '5 ft 10 in' 279*5153720fSfkaag71 ) 280*5153720fSfkaag71 ) 281*5153720fSfkaag71 )), 282*5153720fSfkaag71 'projection' => array ( 283*5153720fSfkaag71 'p', 284*5153720fSfkaag71 'length' 285*5153720fSfkaag71 ), 286*5153720fSfkaag71 'ordering' => array ( 287*5153720fSfkaag71 array ( 288*5153720fSfkaag71 'variable' => 'p', 289*5153720fSfkaag71 'direction' => 'asc' 290*5153720fSfkaag71 ) 291*5153720fSfkaag71 ) 292*5153720fSfkaag71 ); 293*5153720fSfkaag71 294*5153720fSfkaag71 $expected = array ( 295*5153720fSfkaag71 array ( 296*5153720fSfkaag71 'p' => array('person:alice'), 297*5153720fSfkaag71 'length' => array('5 ft 5 in') 298*5153720fSfkaag71 ), 299*5153720fSfkaag71 array ( 300*5153720fSfkaag71 'p' => array('person:carol'), 301*5153720fSfkaag71 'length' => array('4 ft 11 in') 302*5153720fSfkaag71 ) 303*5153720fSfkaag71 ); 304*5153720fSfkaag71 305*5153720fSfkaag71 $this->assertQueryResult($query, $expected, 'Natural comparison unsupported'); 306*5153720fSfkaag71 } 307*5153720fSfkaag71 308*5153720fSfkaag71} 309