Search code examples
node.jsindexingnestjsravendb

Ravendb Nodejs, using Enums in the map index


I use ravendb in nestjs

I have an enum in the library project (core library):

export enum GroupType {
    Agent = "agent",
    System = "system"
}

and I import and use that enum in the index logic (raven project)

import { Models } from '@ply/core';
        
export class Agents_All extends AbstractJavaScriptMultiMapIndexCreationTask<AgentResult> {
        this.map<IUser>(User, user => {
            if(user.groupType === Models.Enums.GroupType.Agent){

Q1 : how can I use my enums or constants in the map index, should I export them to the Ravendb as an additional source? export enum like a function?

and below is the generated map index on the Ravendb side : enter image description here Q2 : why did Ravendb add the project's name of the enum as a namespace before the enum

Models.Enums.GroupType.Agent converted to core_1.Models.Enums.GroupType.Agent


Solution

  • We implemented this feature and in order to use such enum, you should register it via this.registerEnum(() => RoleString.Admin); call. Then you can use such enum inside map/reduce function and it is replaced with correct enum value.

    enum RoleNumber {
        Admin,
        User
    }
    
    
    class User {
        id: string;
        name: string;
        roleString: RoleString;
        roleNumber: RoleNumber;
    }
    
    class UsersByStringRole extends AbstractJavaScriptIndexCreationTask<User, Pick<User, "name" | "roleString">> {
    
        constructor() {
            super();
    
            this.registerEnum(() => (RoleString.Admin));
    
            this.map(User, u => {
                if (u.roleString === RoleString.Admin) {
                    return ({
                        name: u.name,
                        roleString: u.roleString
                    });
                }
                return null;
            });
        }
    }
    
    class UsersByNumberRole extends AbstractJavaScriptIndexCreationTask<User, Pick<User, "name" | "roleNumber">> {
    
        constructor() {
            super();
    
            this.registerEnum(() => RoleNumber.Admin);
    
            this.map(User, u => {
                if (u.roleNumber === RoleNumber.Admin) {
                    return ({
                        name: u.name,
                        roleNumber: u.roleNumber
                    });
                }
                return null;
            });
        }
    }