public function getHumanReadable($segmentString, $idSite) { if (empty($segmentString)) { return Piwik::translate('SegmentEditor_DefaultAllVisits'); } try { $segment = new SegmentExpression(urldecode($segmentString)); $expressions = $segment->parseSubExpressions(); } catch (Exception $e) { $segment = new SegmentExpression($segmentString); $expressions = $segment->parseSubExpressions(); } $readable = ''; foreach ($expressions as $expression) { $operator = $expression[SegmentExpression::INDEX_BOOL_OPERATOR]; $operand = $expression[SegmentExpression::INDEX_OPERAND]; $name = $operand[SegmentExpression::INDEX_OPERAND_NAME]; $segment = $this->segmentList->findSegment($name, $idSite); if (empty($segment)) { throw new Exception(sprintf("The segment '%s' does not exist.", $name)); } $readable .= $segment['name'] . ' '; $readable .= $this->getTranslationForComparison($operand, $segment['type']) . ' '; $readable .= $this->getFormattedValue($operand); $readable .= $this->getTranslationForBoolOperator($operator) . ' '; } $readable = trim($readable); return $readable; }
public function test_getSelectQueryString_DecoratesSql_WhenMultipleStoredSegmentsMatchUsedSegment() { $expression = new SegmentExpression('region!=FL'); $expression->parseSubExpressions(); $query = $this->decorator->getSelectQueryString($expression, '*', 'log_visit', '', array(), '', '', ''); $this->assertStringStartsWith('/* idSegments = [2, 4] */', $query['sql']); }
/** * @dataProvider getBogusFilters * @group Core */ public function testBogusFiltersExpectExceptionThrown($bogus) { try { $segment = new SegmentExpression($bogus); $segment->parseSubExpressions(); $segment->getSql(); } catch (\Exception $e) { return; } $this->fail('Expected exception not raised for:' . var_export($segment->getSql(), true)); }
/** * @param $string * @param $idSites * @throws Exception */ protected function initializeSegment($string, $idSites) { // As a preventive measure, we restrict the filter size to a safe limit $string = substr($string, 0, self::SEGMENT_TRUNCATE_LIMIT); $this->string = $string; $this->idSites = $idSites; $segment = new SegmentExpression($string); $this->segmentExpression = $segment; // parse segments $expressions = $segment->parseSubExpressions(); // convert segments name to sql segment // check that user is allowed to view this segment // and apply a filter to the value to match if necessary (to map DB fields format) $cleanedExpressions = array(); foreach ($expressions as $expression) { $operand = $expression[SegmentExpression::INDEX_OPERAND]; $cleanedExpression = $this->getCleanedExpression($operand); $expression[SegmentExpression::INDEX_OPERAND] = $cleanedExpression; $cleanedExpressions[] = $expression; } $segment->setSubExpressionsAfterCleanup($cleanedExpressions); }