コード例 #1
0
 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']);
 }
コード例 #2
0
 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;
 }
コード例 #3
0
ファイル: LogQueryBuilder.php プロジェクト: cemo/piwik
 public function getSelectQueryString(SegmentExpression $segmentExpression, $select, $from, $where, $bind, $groupBy, $orderBy, $limit)
 {
     if (!is_array($from)) {
         $from = array($from);
     }
     $fromInitially = $from;
     if (!$segmentExpression->isEmpty()) {
         $segmentExpression->parseSubExpressionsIntoSqlExpressions($from);
         $segmentSql = $segmentExpression->getSql();
         $where = $this->getWhereMatchBoth($where, $segmentSql['where']);
         $bind = array_merge($bind, $segmentSql['bind']);
     }
     $joins = $this->generateJoinsString($from);
     $joinWithSubSelect = $joins['joinWithSubSelect'];
     $from = $joins['sql'];
     // hack for https://github.com/piwik/piwik/issues/9194#issuecomment-164321612
     $useSpecialConversionGroupBy = !empty($segmentSql) && strpos($groupBy, 'log_conversion.idgoal') !== false && $fromInitially == array('log_conversion') && strpos($from, 'log_link_visit_action') !== false;
     if ($useSpecialConversionGroupBy) {
         $innerGroupBy = "CONCAT(log_conversion.idvisit, '_' , log_conversion.idgoal, '_', log_conversion.buster)";
         $sql = $this->buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit, $innerGroupBy);
     } elseif ($joinWithSubSelect) {
         $sql = $this->buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
     } else {
         $sql = $this->buildSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
     }
     return array('sql' => $sql, 'bind' => $bind);
 }
コード例 #4
0
 private function getSegmentIdOfExpression(SegmentExpression $segmentExpression)
 {
     $allSegments = $this->storedSegmentService->getAllSegmentsAndIgnoreVisibility();
     $idSegments = array();
     foreach ($allSegments as $segment) {
         if ($segmentExpression->getSegmentDefinition() == $segment['definition']) {
             $idSegments[] = $segment['idsegment'];
         }
     }
     return $idSegments;
 }
コード例 #5
0
 /**
  * @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));
 }
コード例 #6
0
ファイル: LogQueryBuilder.php プロジェクト: mgou-net/piwik
 public function getSelectQueryString(SegmentExpression $segmentExpression, $select, $from, $where, $bind, $groupBy, $orderBy, $limit)
 {
     if (!is_array($from)) {
         $from = array($from);
     }
     if (!$segmentExpression->isEmpty()) {
         $segmentExpression->parseSubExpressionsIntoSqlExpressions($from);
         $segmentSql = $segmentExpression->getSql();
         $where = $this->getWhereMatchBoth($where, $segmentSql['where']);
         $bind = array_merge($bind, $segmentSql['bind']);
     }
     $joins = $this->generateJoinsString($from);
     $joinWithSubSelect = $joins['joinWithSubSelect'];
     $from = $joins['sql'];
     if ($joinWithSubSelect) {
         $sql = $this->buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
     } else {
         $sql = $this->buildSelectQuery($select, $from, $where, $groupBy, $orderBy, $limit);
     }
     return array('sql' => $sql, 'bind' => $bind);
 }
コード例 #7
0
ファイル: Segment.php プロジェクト: FluentDevelopment/piwik
 /**
  * Returns `true` if the segment is empty, `false` if otherwise.
  */
 public function isEmpty()
 {
     return $this->segmentExpression->isEmpty();
 }