Skip to content


pageUrl segment does not work with =@ contains operator #2727

mattab opened this Issue · 8 comments

3 participants

Piwik Open Source Analytics member

Is there currently another way to achieve the segmentation behavior expected when using the pageUrl segment with the =@ contains operator? Thanks.

Piwik Open Source Analytics member

(In [5719]) refs #2727 =@ and !@ for pageUrl / pageTitle segments

Piwik Open Source Analytics member

The segmentation mechanism with callbacks was built for comparing against a single ID, which only works for == and !=. I tried to introduce dynamic SQL sub-expression with as little impact on the existing system as possible.

  • For LIKE matches (=@, !@), the callback of the Actions plugin returns an array with the index SQL. This can be discerned from regular literal values.
  • Segment recognizes the array and changes the match type to IN.
  • SegmentExpression recognizes the match type IN and injects the sub-expression. It marks the value as null because there are no parameters to be bound in the sub-expression. This null value is recognized in other parts of SegmentExpression to build the query without a ?-parameter and a bound value.

Btw, I changed the "action not found"-value from -1 to -100 because we were discussing to use -1 for something else. When we do, we would most likely forget to change the value. ;)

Please review.

Piwik Open Source Analytics member

(In [5742]) Fixes #2727

  • Kuddos EZDesign for initial commit!!
  • Reviewed code & now more secure: use bind parameters rather than manually escaping SQL
  • Added integration tests for contains/ does not contain for title/URL. Also added test for the special case characters _ and % (ensure they are properly quoted since they are mysql special characters in a LIKE statement).


  • when you add &segment=pageTitle!=XXXXX to the request, it will sometimes return a different result data set than when the parameter is not added at all (one might expect the same data set in both cases).
    Adding a segment condition on pageTitle or pageUrl will restrict the visits being looked at, and once you add this condition segment=pageTitle== THEN Piwik will only look at visits that had at least one Page Title and then will apply the condition.
    ie. When using segment=pageTitle!=test Piwik will IGNORE all visits that do not have any "Page title", and will then exclude the remaining "Page title" that do not match the condition.

  • it does not make sense to call Actions.getPageUrls segmented on pageTitle: result will not be what you expect.
    Similarly, calling Actions.getPageTitles with segment=pageUrl=@Test will NOT return page titles that belong to a URL matching Test. Instead it will return all page titles, that have been visited by a visitor that visited a page URL containing Test.

Piwik Open Source Analytics member

Nice update, makes it much cleaner!

What makes you think the second limitaion exists? Page title und page URL are both action-based reports/segments, so the output should be as expected. It tried it on my local box and it works.

Piwik Open Source Analytics member

Thanks for feedback, reopening to investigate further my claim

Piwik Open Source Analytics member

You're right, it WORKS! :)

@mattab mattab added this to the 1.7 Piwik 1.7 milestone
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.