rescribet/link-lib

View on GitHub
src/store/StructuredStore/references.ts

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
import { TermType } from "@ontologies/core";

import { DataRecord, DataSlice, Id } from "../../datastrucures/DataSlice";
import { FieldValue } from "../../datastrucures/Fields";
import { idField } from "../StructuredStore";

export const fieldReferences = (values: FieldValue, referenced: Id): boolean => {
  if (Array.isArray(values)) {
    for (const value of values) {
      if (value.termType !== TermType.Literal && value.value === referenced) {
        return true;
      }
    }
  } else {
    if (values.termType !== TermType.Literal && values.value === referenced) {
      return true;
    }
  }

  return false;
};

export const hasReferenceTo = (record: DataRecord, referenced: Id): boolean => {
  for (const field in record) {
    if (!record.hasOwnProperty(field) || field === idField) {
      continue;
    }

    const values = record[field];
    if (fieldReferences(values, referenced)) {
      return true;
    }
  }

  return false;
};

export const findAllReferencingIds = (data: DataSlice, referenced: Id): Id[] => {
  const found = [];

  for (const id in data) {
    if (!data.hasOwnProperty(id)) {
      continue;
    }

    const record = data[id];
    if (hasReferenceTo(record, referenced)) {
      found.push(id);
    }
  }

  return found;
};