bib search api wip
authorBill Erickson <berickxx@gmail.com>
Mon, 29 Oct 2018 22:17:01 +0000 (18:17 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 8 Nov 2018 19:01:13 +0000 (14:01 -0500)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/share/catalog/catalog.service.ts
Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Elastic.pm

index b3f772b..5b82ae5 100644 (file)
@@ -121,37 +121,19 @@ export class CatalogService {
             return Promise.resolve();
         }
 
+        if (ctx.result.facets) {
+            // No need to fetch pre-compiled facets
+            console.debug('Showing pre-compiled facets');
+            ctx.result.facetData = this.formatFacets(ctx.result.facets);
+            return Promise.resolve();
+        }
+
         return new Promise((resolve, reject) => {
             this.net.request('open-ils.search',
                 'open-ils.search.facet_cache.retrieve',
                 ctx.result.facet_key
             ).subscribe(facets => {
-                const facetData = {};
-                Object.keys(facets).forEach(cmfId => {
-                    const facetHash = facets[cmfId];
-                    const cmf = this.cmfMap[cmfId];
-
-                    const cmfData = [];
-                    Object.keys(facetHash).forEach(value => {
-                        const count = facetHash[value];
-                        cmfData.push({value : value, count : count});
-                    });
-
-                    if (!facetData[cmf.field_class()]) {
-                        facetData[cmf.field_class()] = {};
-                    }
-
-                    facetData[cmf.field_class()][cmf.name()] = {
-                        cmfLabel : cmf.label(),
-                        valueList : cmfData.sort((a, b) => {
-                            if (a.count > b.count) { return -1; }
-                            if (a.count < b.count) { return 1; }
-                            // secondary alpha sort on display value
-                            return a.value < b.value ? -1 : 1;
-                        })
-                    };
-                });
-
+                const facetData = this.formatFacets(facets);
                 this.lastFacetKey = ctx.result.facet_key;
                 this.lastFacetData = ctx.result.facetData = facetData;
                 resolve();
@@ -159,6 +141,36 @@ export class CatalogService {
         });
     }
 
+    formatFacets(facets: any) {
+        const facetData = {};
+        Object.keys(facets).forEach(cmfId => {
+            const facetHash = facets[cmfId];
+            const cmf = this.cmfMap[cmfId];
+
+            const cmfData = [];
+            Object.keys(facetHash).forEach(value => {
+                const count = facetHash[value];
+                cmfData.push({value : value, count : count});
+            });
+
+            if (!facetData[cmf.field_class()]) {
+                facetData[cmf.field_class()] = {};
+            }
+
+            facetData[cmf.field_class()][cmf.name()] = {
+                cmfLabel : cmf.label(),
+                valueList : cmfData.sort((a, b) => {
+                    if (a.count > b.count) { return -1; }
+                    if (a.count < b.count) { return 1; }
+                    // secondary alpha sort on display value
+                    return a.value < b.value ? -1 : 1;
+                })
+            };
+        });
+
+        return facetData;
+    }
+
     fetchCcvms(): Promise<void> {
 
         if (Object.keys(this.ccvmMap).length) {
index fbc3460..f2f1b6e 100644 (file)
@@ -59,7 +59,6 @@ sub bib_search {
 
     return {count => 0} unless $results;
 
-    format_facets($results->{aggregations});
 
     return {
         count => $results->{hits}->{total},
@@ -67,7 +66,7 @@ sub bib_search {
             map { [$_->{_id}, undef, $_->{_score}] } 
                 grep {defined $_} @{$results->{hits}->{hits}}
         ],
-        facets => $results->{aggregations},
+        facets => format_facets($results->{aggregations}),
         # Note at time of writing no search caching is used for 
         # Elasticsearch, but providing cache keys allows the caller to 
         # know if this search matches another search.
@@ -83,7 +82,8 @@ sub format_facets {
 
     for my $fname (keys %$aggregations) {
 
-        my ($name, $field_class) = split('|', $fname);
+        my ($field_class, $name) = split(/\|/, $fname);
+
         my ($bib_field) = grep {
             $_->name eq $name && $_->search_group eq $field_class
         } @$bib_search_fields;