Skip to content

Commit

Permalink
cubejs library all missing queries for dashboard added
Browse files Browse the repository at this point in the history
  • Loading branch information
epipav committed Jan 9, 2024
1 parent 1cbef58 commit db29676
Show file tree
Hide file tree
Showing 10 changed files with 401 additions and 6 deletions.
5 changes: 3 additions & 2 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
"script:get-organization-enrichment-data": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/get-organization-enrichment-data.ts",
"script:refresh-materialized-views": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/refresh-materialized-views.ts",
"script:unmerge-members": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/unmerge-members.ts",
"script:merge-similar-organizations": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/merge-similar-organizations.ts"
"script:merge-similar-organizations": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/merge-similar-organizations.ts",
"script:get-dashboard-data": "SERVICE=script TS_NODE_TRANSPILE_ONLY=true node -r tsconfig-paths/register -r ts-node/register src/bin/scripts/get-dashboard-data.ts"
},
"dependencies": {
"@aws-sdk/client-comprehend": "^3.159.0",
Expand Down Expand Up @@ -181,4 +182,4 @@
"ts-node": "10.6.0",
"typescript": "^5.2.2"
}
}
}
80 changes: 80 additions & 0 deletions backend/src/bin/scripts/get-dashboard-data.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import commandLineArgs from 'command-line-args'
import commandLineUsage from 'command-line-usage'
import * as fs from 'fs'
import path from 'path'
import { CubeJsRepository, CubeJsService } from '@crowd/cubejs'
import moment from 'moment-timezone'
import { databaseInit } from '@/database/databaseConnection'
import { getServiceLogger } from '@crowd/logging'

/* eslint-disable no-console */

const banner = fs.readFileSync(path.join(__dirname, 'banner.txt'), 'utf8')

const log = getServiceLogger()

const options = [
{
name: 'help',
alias: 'h',
type: Boolean,
description: 'Print this usage guide.',
},
{
name: 'tenantId',
alias: 't',
type: String,
description: 'Tenant ID',
},
{
name: 'segmentId',
alias: 's',
type: String,
description: 'Segment ID',
},
]
const sections = [
{
content: banner,
raw: true,
},
{
header: `Unmerge a member from another member using a snapshot db`,
content: 'Unmerge a member from another member using a snapshot db',
},
{
header: 'Options',
optionList: options,
},
]

const usage = commandLineUsage(sections)
const parameters = commandLineArgs(options)

if (parameters.help || !parameters.tenantId || !parameters.segmentId) {
console.log(usage)
} else {
setImmediate(async () => {
const db = await databaseInit()

const cubejsService = new CubeJsService()

await cubejsService.init(parameters.tenantId, [parameters.segmentId], log)

const start = moment().subtract(6, 'days').startOf('day')

const end = moment().endOf('day')

const data = await CubeJsRepository.getActiveMembersTimeseries(
cubejsService,
start,
end,
'day',
null,
)

console.log(data)

process.exit(0)
})
}
12 changes: 9 additions & 3 deletions services/libs/cubejs/src/metrics/activeMembersTimeseries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { CubeJsService } from '../service'
import CubeDimensions from '../dimensions'
import CubeMeasures from '../measures'
import { ICubeFilter } from 'types'
import { CubeGranularity } from 'enums'
import { CubeGranularity } from '../enums'

/**
* Gets `active members` timeseries data for a given date range in given granularity.
Expand Down Expand Up @@ -56,7 +56,7 @@ export default async (
})
}

const activeMembersTimeseries = await cjs.load({
const query = {
measures: [CubeMeasures.MEMBER_COUNT],
timeDimensions: [
{
Expand All @@ -67,9 +67,15 @@ export default async (
],
// order: { [CubeDimensions.MEMBER_JOINED_AT]: 'asc' },
filters,
}) // [0][CubeMeasures.MEMBER_COUNT] ?? 0
}

cjs.log.info(query)

const activeMembersTimeseries = await cjs.load(query) // [0][CubeMeasures.MEMBER_COUNT] ?? 0

console.log(activeMembersTimeseries)

return activeMembersTimeseries || []

// return parseInt(activeMembers, 10)
}
71 changes: 71 additions & 0 deletions services/libs/cubejs/src/metrics/activeOrganizationsTimeseries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import moment from 'moment'

import { CubeJsService } from '../service'
import CubeDimensions from '../dimensions'
import CubeMeasures from '../measures'
import { ICubeFilter } from 'types'
import { CubeGranularity } from '../enums'

/**
* Gets `active organizations` timeseries data for a given date range in given granularity.
* Organizations are active when they have an activity in given date range.
* @param cjs cubejs service instance
* @param startDate
* @param endDate
* @returns
*/
export default async (
cjs: CubeJsService,
startDate: moment.Moment,
endDate: moment.Moment,
granularity: CubeGranularity = CubeGranularity.DAY,
platform: string = undefined,
segment: string = undefined,
) => {
const filters: ICubeFilter[] = [
{
member: CubeDimensions.IS_TEAM_MEMBER,
operator: 'equals',
values: ['false'],
},
{
member: CubeDimensions.IS_BOT,
operator: 'equals',
values: ['false'],
},
]

if (platform) {
filters.push({
member: CubeDimensions.ACTIVITY_PLATFORM,
operator: 'equals',
values: [platform],
})
}

if (segment) {
filters.push({
member: CubeDimensions.SEGMENTS_ID,
operator: 'equals',
values: [segment],
})
}

const query = {
measures: [CubeMeasures.ORGANIZATION_COUNT],
timeDimensions: [
{
dimension: CubeDimensions.ACTIVITY_DATE,
dateRange: [startDate.format('YYYY-MM-DD'), endDate.format('YYYY-MM-DD')],
granularity,
},
],
filters,
}

cjs.log.info(query)

const activeOrganizationsTimeseries = await cjs.load(query)

return activeOrganizationsTimeseries || []
}
5 changes: 5 additions & 0 deletions services/libs/cubejs/src/metrics/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
export { default as newActivities } from './newActivities'
export { default as newActivitiesTimeseries } from './newActivitiesTimeseries'
export { default as newConversations } from './newConversations'
export { default as activeMembers } from './activeMembers'
export { default as activeMembersTimeseries } from './activeMembersTimeseries'
export { default as newMembers } from './newMembers'
export { default as newMembersTimeseries } from './newMembersTimeseries'
export { default as newOrganizations } from './newOrganizations'
export { default as newOrganizationsTimeseries } from './newOrganizationsTimeseries'
export { default as activeOrganizations } from './activeOrganizations'
export { default as activeOrganizationsTimeseries } from './activeOrganizationsTimeseries'
71 changes: 71 additions & 0 deletions services/libs/cubejs/src/metrics/newActivitiesTimeseries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import moment from 'moment'

import { CubeJsService } from '../service'
import CubeDimensions from '../dimensions'
import CubeMeasures from '../measures'
import { ICubeFilter } from 'types'
import { CubeGranularity } from '../enums'

/**
* Gets `new activities` timeseries data for a given date range in given granularity.
* Activities are new when activity.timestamp is in between given date range.
* @param cjs cubejs service instance
* @param startDate
* @param endDate
* @returns
*/
export default async (
cjs: CubeJsService,
startDate: moment.Moment,
endDate: moment.Moment,
granularity: CubeGranularity = CubeGranularity.DAY,
platform: string = undefined,
segment: string = undefined,
) => {
const filters: ICubeFilter[] = [
{
member: CubeDimensions.IS_TEAM_MEMBER,
operator: 'equals',
values: ['false'],
},
{
member: CubeDimensions.IS_BOT,
operator: 'equals',
values: ['false'],
},
]

if (platform) {
filters.push({
member: CubeDimensions.ACTIVITY_PLATFORM,
operator: 'equals',
values: [platform],
})
}

if (segment) {
filters.push({
member: CubeDimensions.SEGMENTS_ID,
operator: 'equals',
values: [segment],
})
}

const query = {
measures: [CubeMeasures.ACTIVITY_COUNT],
timeDimensions: [
{
dimension: CubeDimensions.ACTIVITY_DATE,
dateRange: [startDate.format('YYYY-MM-DD'), endDate.format('YYYY-MM-DD')],
granularity,
},
],
filters,
}

cjs.log.info(query)

const newActivitiesTimeseries = await cjs.load(query)

return newActivitiesTimeseries || []
}
76 changes: 76 additions & 0 deletions services/libs/cubejs/src/metrics/newMembersTimeseries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import moment from 'moment'

import { CubeJsService } from '../service'
import CubeDimensions from '../dimensions'
import CubeMeasures from '../measures'
import { ICubeFilter } from 'types'
import { CubeGranularity } from '../enums'

/**
* Gets `new members` timeseries data for a given date range in given granularity.
* Members are new when member.joinedAt is in between given date range.
* @param cjs cubejs service instance
* @param startDate
* @param endDate
* @returns
*/
export default async (
cjs: CubeJsService,
startDate: moment.Moment,
endDate: moment.Moment,
granularity: CubeGranularity = CubeGranularity.DAY,
platform: string = undefined,
segment: string = undefined,
) => {
const filters: ICubeFilter[] = [
{
member: CubeDimensions.IS_TEAM_MEMBER,
operator: 'equals',
values: ['false'],
},
{
member: CubeDimensions.IS_BOT,
operator: 'equals',
values: ['false'],
},
{
member: CubeDimensions.IS_ORGANIZATION,
operator: 'equals',
values: ['false'],
},
]

if (platform) {
filters.push({
member: CubeDimensions.ACTIVITY_PLATFORM,
operator: 'equals',
values: [platform],
})
}

if (segment) {
filters.push({
member: CubeDimensions.SEGMENTS_ID,
operator: 'equals',
values: [segment],
})
}

const query = {
measures: [CubeMeasures.MEMBER_COUNT],
timeDimensions: [
{
dimension: CubeDimensions.MEMBER_JOINED_AT,
dateRange: [startDate.format('YYYY-MM-DD'), endDate.format('YYYY-MM-DD')],
granularity,
},
],
filters,
}

cjs.log.info(query)

const newMembersTimeseries = await cjs.load(query)

return newMembersTimeseries || []
}
Loading

0 comments on commit db29676

Please sign in to comment.