Introducing a new filter type: regex

Hello Keen community!

We are happy to announce a new filter type — regex — to allow more complex searches on property names.

What is regex?

Regular expression (regex for short) is a string of text that allows you to create a match that helps you find a special combination of characters in text faster. It may seem like a different language at first, but mastering regular expressions can save you thousands of hours when working with large sets of data.

Regex e-mail matching example

Simple examples of count and regex filter:

For example, to find a word in the string ‘Keen is the best platform for in-products analytics’
the matcher for the word ‘best’ is just ‘best’.

For the property name-value equal to ‘Aadnjsdnja-AAA-P12341’, refer to the code snippets below:

1. Using cURL:

curl https://api.keen.io/3.0/projects/PROJECT_ID/queries/count \
    -H "Authorization: READ_KEY" \
    -H 'Content-Type: application/json' \
    -d "{
        \"event_collection\": \"COLLECTION_NAME\",
        \"timeframe\": \"this_14_days\",
        \"filters\": [
          {
            \"property_name\" : \"PROPERTY_NAME\",
            \"operator\" : \"regex\",
            \"property_value\" : \"[A-Z][a-z]+-[A-Z]{3}-P[0-9]{1,16}\"
          }
        ]
    }"

regex cURL example

2. Using JavaScript

// Browsers
// import KeenAnalysis from 'keen-analysis';

// Node.js
const KeenAnalysis = require('keen-analysis');

const client = new KeenAnalysis({
  projectId: 'PROJECT_ID',
  readKey: 'READ_KEY',
});

client
  .query({
    analysisType: 'count',
    eventCollection: 'COLLECTION_NAME',
    filters: [
      {
        propertyName: 'PROPERTY_NAME',
        operator: 'regex',
        propertyValue: '[A-Z][a-z]+-[A-Z]{3}-P[0-9]{1,16}',
      },
    ],
    timeframe: 'this_14_days',
  })
  .then(res => {
    // Handle results
  })
  .catch(err => {
    // Handle errors
  });

regex JavaScript example

3. Using Java

KeenProject keenProject = new KeenProject(PROJECT_ID, WRITE_KEY, READ_KEY);
KeenQueryClient keenQueryClient = new KeenQueryClient.Builder(keenProject)
        .build();

Query query = new Query.Builder(QueryType.COUNT)
        .withEventCollection(COLLECTION_NAME)
        .withTimeframe(new RelativeTimeframe("this_14_days"))
        .withTimezone("UTC")
        .withFilter(PROPERTY_NAME, FilterOperator.REGEX, "[A-Z][a-z]+-[A-Z]{3}-P[0-9]{1,16}")
        .build();

QueryResult result = keenQueryClient.execute(query);
if (result.isLong()) {
    long queryResult = result.longValue();
}

regex Java example

To match strings generated by UUID for example, ‘123e4567-e89b-12d3-a456-426614174000’:

^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[0-9]{12}$

^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$

^[a-z0-9]{8}-([a-z0-9]{4}-){3}[a-z0-9]{12}$

^\w{8}(-\w{4}){3}-\w{12}$

1. Using cURL:

curl https://staging-api.keen.io/3.0/projects/PROJECT_ID/queries/count \
    -H "Authorization: READ_KEY" \
    -H 'Content-Type: application/json' \
    -d "{
        \"event_collection\": \"regex-2\",
        \"timeframe\": \"this_14_days\",
        \"filters\": [
          {
            \"property_name\" : \"regex-2\",
            \"operator\" : \"regex\",
            \"property_value\" : \"^\\\w{8}(-\\\w{4}){3}-\\\w{12}$\"
          }
        ]
    }" | python -m json.tool

regex cURL example

2. Using JavaScript

import KeenAnalysis from 'keen-analysis';

const client = new KeenAnalysis({
  projectId: 'PROJECT_ID',
  readKey: 'READ_KEY',
});

client
  .query({
    analysisType: 'count',
    eventCollection: 'COLLECTION_NAME',
    filters: [
      {
        propertyName: 'PROPERTY_NAME',
        operator: 'regex',
        propertyValue: '^\\w{8}(-\\w{4}){3}-\\w{12}$',
      },
    ],
    timeframe: 'this_14_days',
  })
  .then(res => {
    // Handle results
  })
  .catch(err => {
    // Handle errors
  });

regex JavaScript example

3. Using Java

KeenProject keenProject = new KeenProject(PROJECT_ID, WRITE_KEY, READ_KEY);
KeenQueryClient keenQueryClient = new KeenQueryClient.Builder(keenProject)
        .build();
Query query = new Query.Builder(QueryType.COUNT)
        .withEventCollection(COLLECTION_NAME)
        .withTimeframe(new RelativeTimeframe("this_14_days"))
        .withTimezone("UTC")
        .withFilter(PROPERTY_NAME, FilterOperator.REGEX, "^\\w{8}(-\\w{4}){3}-\\w{12}$")
        .build();

QueryResult result = keenQueryClient.execute(query);
if (result.isLong()) {
    long queryResult = result.longValue();
    System.out.println(queryResult);
}

regex Java example

The final result is a number type.

Thank you for reading! Please reach out with any feedback or questions.