Ticket #2727 (closed Bug: fixed)

Opened 7 months ago

Last modified 3 months ago

pageUrl segment does not work with =@ contains operator

Reported by: matt Owned by:
Priority: major Milestone: 1.7 Piwik 1.7
Component: Core Keywords:
Cc: Sensitive: no

Change History

Changed 7 months ago by matt

  • description modified (diff)

Changed 7 months ago by matt

  • summary changed from pageUrl segment does not work with =@ operator to pageUrl segment does not work with =@ contains operator

Changed 5 months ago by mk3vil

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

Changed 4 months ago by EZdesign

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

Changed 4 months ago by EZdesign

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.

Changed 4 months ago by matt

  • status changed from new to closed
  • resolution set to fixed

(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).

IMPLEMENTATION NOTES / limitations:

  • 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.

Changed 4 months ago by EZdesign

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.

Changed 4 months ago by matt

  • status changed from closed to reopened
  • resolution fixed deleted

Thanks for feedback, reopening to investigate further my claim

Changed 3 months ago by matt

  • status changed from reopened to closed
  • resolution set to fixed

You're right, it WORKS! :)

Changed 3 months ago by matt

  • priority changed from normal to major
Note: See TracTickets for help on using tickets.