protected static function _compile_set_data($op, $value , $parameters)
{
$op = strtolower($op);
$op_arr = array
(
'>' => 'gt',
'>=' => 'gte',
'<' => 'lt',
'<=' => 'lte',
'!=' => 'ne',
'<>' => 'ne',
);
if ($op === 'between' && is_array($value))
{
list ($min, $max) = $value;
if (is_string($min) && array_key_exists($min, $parameters))
{
$min = $parameters[$min];
}
$option['$gte'] = $min;
if (is_string($max) && array_key_exists($max, $parameters))
{
$max = $parameters[$max];
}
$option['$lte'] = $max;
}
elseif ($op==='=')
{
if (is_object($value))
{
if ($value instanceof MongoCode)
{
$option['$where'] = $value;
}
elseif ($value instanceof Database_Expression)
{
$option = $value->value();
}
else
{
$option = $value;
}
}
else
{
$option = $value;
}
}
elseif ($op==='in')
{
$option = array('$in'=>$value);
}
elseif ($op==='not in')
{
$option = array('$nin'=>$value);
}
elseif ($op==='mod')
{
if ($value[2]=='=')
{
$option = array('$mod'=>array($value[0],$value[1]));
}
elseif ($value[2]=='!='||$value[2]=='not')
{
$option = array
(
'$ne' => array('$mod'=>array($value[0],$value[1]))
);
}
elseif (substr($value[2],0,1)=='$')
{
$option = array
(
$value[2] => array('$mod'=>array($value[0],$value[1]))
);
}
elseif (isset($value[2]))
{
$option = array
(
'$'.$value[2] => array('$mod'=>array($value[0],$value[1]))
);
}
}
elseif ($op==='like')
{
// 将like转换成正则处理
$value = preg_quote($value,'/');
if (substr($value,0,1)=='%')
{
$value = '/' . substr($value,1);
}
else
{
$value = '/^'.$value;
}
if (substr($value,-1)=='%')
{
$value = substr($value,0,-1) . '/i';
}
else
{
$value = $value.'$/i';
}
$value = str_replace('%','*',$value);
$option = new MongoRegex($value);
}
else
{
if (isset($op_arr[$op]))
{
$option['$'.$op_arr[$op]] = $value;
}
}
return $option;
}