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']); }
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 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); }
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; }
/** * @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)); }
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); }
/** * Returns `true` if the segment is empty, `false` if otherwise. */ public function isEmpty() { return $this->segmentExpression->isEmpty(); }