aboutsummaryrefslogtreecommitdiff
path: root/src/server/updateSearch.ts
blob: dd2067c876d1ef2ce000e63a53c719183fd68066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { Database } from "./database";
import { Search } from "./Search";
import { log_execution } from "./ActionUtilities";
import { cyan, green, yellow, red } from "colors";

const suffixMap: { [type: string]: (string | [string, string | ((json: any) => any)]) } = {
    "number": "_n",
    "string": "_t",
    "boolean": "_b",
    "image": ["_t", "url"],
    "video": ["_t", "url"],
    "pdf": ["_t", "url"],
    "audio": ["_t", "url"],
    "web": ["_t", "url"],
    "date": ["_d", value => new Date(value.date).toISOString()],
    "proxy": ["_i", "fieldId"],
    "list": ["_l", list => {
        const results = [];
        for (const value of list.fields) {
            const term = ToSearchTerm(value);
            if (term) {
                results.push(term.value);
            }
        }
        return results.length ? results : null;
    }]
};

function ToSearchTerm(val: any): { suffix: string, value: any } | undefined {
    if (val === null || val === undefined) {
        return;
    }
    const type = val.__type || typeof val;
    let suffix = suffixMap[type];
    if (!suffix) {
        return;
    }

    if (Array.isArray(suffix)) {
        const accessor = suffix[1];
        if (typeof accessor === "function") {
            val = accessor(val);
        } else {
            val = val[accessor];
        }
        suffix = suffix[0];
    }

    return { suffix, value: val };
}

async function update() {
    console.log(green("Beginning update..."));
    await log_execution<void>({
        startMessage: "Clearing existing Solr information...",
        endMessage: "Solr information successfully cleared",
        action: Search.clear,
        color: cyan
    });
    const cursor = await log_execution({
        startMessage: "Connecting to and querying for all documents from database...",
        endMessage: ({ result, error }) => {
            const success = error === null && result !== undefined;
            if (!success) {
                console.log(red("Unable to connect to the database."));
                process.exit(0);
            }
            return "Connection successful and query complete";
        },
        action: () => Database.Instance.query({}),
        color: yellow
    });
    const updates: any[] = [];
    let numDocs = 0;
    function updateDoc(doc: any) {
        numDocs++;
        if ((numDocs % 50) === 0) {
            console.log(`Batch of 50 complete, total of ${numDocs}`);
        }
        if (doc.__type !== "Doc") {
            return;
        }
        const fields = doc.fields;
        if (!fields) {
            return;
        }
        const update: any = { id: doc._id };
        let dynfield = false;
        for (const key in fields) {
            const value = fields[key];
            const term = ToSearchTerm(value);
            if (term !== undefined) {
                const { suffix, value } = term;
                update[key + suffix] = value;
                dynfield = true;
            }
        }
        if (dynfield) {
            updates.push(update);
        }
    }
    await cursor?.forEach(updateDoc);
    const result = await log_execution({
        startMessage: `Dispatching updates for ${updates.length} documents`,
        endMessage: "Dispatched updates complete",
        action: () => Search.updateDocuments(updates),
        color: cyan
    });
    try {
        if (result) {
            const { status } = JSON.parse(result).responseHeader;
            console.log(status ? red(`Failed with status code (${status})`) : green("Success!"));
        } else {
            console.log(red("Solr is likely not running!"));
        }
    } catch (e) {
        console.log(red("Error:"));
        console.log(e);
        console.log("\n");
    }
    await cursor?.close();
    process.exit(0);
}

update();