diff --git a/src/storage/elasticsearch/common.ts b/src/storage/elasticsearch/common.ts
index f7a664f3..b12a1a6b 100644
--- a/src/storage/elasticsearch/common.ts
+++ b/src/storage/elasticsearch/common.ts
@@ -13,7 +13,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
-import {SCThings, SCThingType} from '@openstapps/core';
+import {SCThingType} from '@openstapps/core';
import {SCThing} from '@openstapps/core';
import {
ESAggMatchAllFilter,
@@ -30,7 +30,7 @@ import {NameList} from 'elasticsearch';
*/
interface Bucket {
/**
- * Number of documents in the agregation bucket
+ * Number of documents in the aggregation bucket
*/
doc_count: number;
@@ -73,21 +73,6 @@ export function isBucketAggregation(agg: BucketAggregation | number): agg is Buc
return typeof agg !== 'number';
}
-/**
- * A response that contains info about whether the item exists plus the object itself
- */
-export interface ItemExistsResponse {
- /**
- * Whether the item exists
- */
- exists: boolean;
-
- /**
- * The object if it exists
- */
- object?: ElasticsearchObject;
-}
-
/**
* An aggregation that contains more aggregations nested inside
*/
@@ -183,7 +168,7 @@ export interface ElasticsearchQueryQueryStringConfig {
}
/**
- * A hit in an elastiscsearch search result
+ * A hit in an elasticsearch search result
* @see https://www.elastic.co/guide/en/elasticsearch/reference/5.6/mapping-fields.html
*/
export interface ElasticsearchObject {
diff --git a/src/storage/elasticsearch/elasticsearch.ts b/src/storage/elasticsearch/elasticsearch.ts
index 1188b7f2..9e2acf22 100644
--- a/src/storage/elasticsearch/elasticsearch.ts
+++ b/src/storage/elasticsearch/elasticsearch.ts
@@ -37,10 +37,9 @@ import {buildAggregations, parseAggregations} from './aggregations';
import {
AggregationResponse,
AggregationSchema,
- ElasticsearchConfig,
+ ElasticsearchConfig, ElasticsearchObject,
ElasticsearchQueryDisMaxConfig,
ElasticsearchQueryQueryStringConfig,
- ItemExistsResponse,
} from './common';
import * as Monitoring from './monitoring';
import {buildQuery, buildSort} from './query';
@@ -213,39 +212,6 @@ export class Elasticsearch implements Database {
this.mailQueue = mailQueue;
}
- /**
- * Tests if an object already exists
- *
- * Returns Elasticsearch Object if it exists
- */
- private async doesItemExist(object: SCThings): Promise {
- const searchResponse: ApiResponse> = await this.client.search({
- body: {
- query: {
- term: {
- 'uid.raw': {
- value: object.uid,
- },
- },
- },
- },
- from: 0,
- index: Elasticsearch.getListOfAllIndices(),
- size: 1,
- });
-
- if (searchResponse.body.hits.total > 0) {
- return {
- exists: true,
- object: searchResponse.body.hits.hits[0],
- };
- }
-
- return {
- exists: false,
- };
- }
-
/**
* Gets a map which contains each alias and all indices that are associated with each alias
*/
@@ -315,6 +281,31 @@ export class Elasticsearch implements Database {
Logger.ok(`Read alias map from elasticsearch: ${JSON.stringify(this.aliasMap, null, 2)}`);
}
+ /**
+ * Provides an elasticsearch object using containing thing's UID
+ * @param uid an UID to use for the search
+ * @returns an elasticsearch object containing the thing
+ */
+ private async getObject(uid: SCUuid): Promise | undefined> {
+ const searchResponse: ApiResponse> = await this.client.search({
+ body: {
+ query: {
+ term: {
+ 'uid.raw': {
+ value: uid,
+ },
+ },
+ },
+ },
+ from: 0,
+ index: Elasticsearch.getListOfAllIndices(),
+ size: 1,
+ });
+
+ // return data from response
+ return searchResponse.body.hits.hits[0];
+ }
+
/**
* Should be called, when a new bulk was created. Creates a new index and applies a the mapping to the index
* @param bulk the bulk process that was created
@@ -452,25 +443,13 @@ export class Elasticsearch implements Database {
* @param uid uid of an SCThing
*/
public async get(uid: SCUuid): Promise {
- const searchResponse: ApiResponse> = await this.client.search({
- body: {
- query: {
- term: {
- uid,
- },
- },
- },
- index: Elasticsearch.getListOfAllIndices(),
- });
+ const object = await this.getObject(uid);
- // get data from response
- const hits = searchResponse.body.hits.hits;
-
- if (hits.length !== 1) {
- throw new Error('No unique item found.');
+ if (typeof object === 'undefined') {
+ throw new Error('Item not found.');
}
- return hits[0]._source;
+ return object._source;
}
/**
@@ -504,12 +483,12 @@ export class Elasticsearch implements Database {
.format(),
};
- const itemMeta = await this.doesItemExist(obj);
+ const item = await this.getObject(object.uid);
// we have to check that the item will get replaced if the index is rolled over
- if (itemMeta.exists && typeof itemMeta.object !== 'undefined') {
+ if (typeof item !== 'undefined') {
const indexOfNew = Elasticsearch.getIndex(obj.type, bulk.source, bulk);
- const oldIndex = itemMeta.object._index;
+ const oldIndex = item._index;
// new item doesn't replace the old one
if (oldIndex.substring(0, oldIndex.length - Elasticsearch.INDEX_UID_LENGTH + 1)
@@ -541,15 +520,15 @@ export class Elasticsearch implements Database {
*/
public async put(object: SCThings): Promise {
- const itemMeta = await this.doesItemExist(object);
+ const item = await this.getObject(object.uid);
- if (itemMeta.exists && typeof itemMeta.object !== 'undefined') {
+ if (typeof item !== 'undefined') {
await this.client.update({
body: {
doc: object,
},
id: object.uid,
- index: itemMeta.object._index,
+ index: item._index,
type: object.type.toLowerCase(),
});