message: mol-model: support isConnectedTo query disjunct and invert
diff: @@ -229,12 +229,13 @@ function withinMinMaxRadius({ queryCtx, selection, target, minRadius, maxRadius,
  interface IsConnectedToCtx {
  queryCtx: QueryContext,
  + disjunct: boolean,
  input: Structure,
  target: Structure
  }
  function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
  - const { queryCtx, input, target } = ctx;
  + const { queryCtx, input, target, disjunct } = ctx;
  const atomicLink = queryCtx.atomicLink;
  const interLinks = input.links;
  @@ -262,6 +263,7 @@ function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
  for (let l = offset[inputIndex], _l = offset[inputIndex + 1]; l < _l; l++) {
  // tElement.element = inputElements[b[l]];
  atomicLink.b.element = inputUnit.elements[b[l]];
  + if (disjunct && SortedArray.has(unit.elements, atomicLink.b.element)) continue;
  if (!target.hasElement(atomicLink.b)) continue;
  atomicLink.aIndex = inputIndex;
  @@ -281,6 +283,7 @@ function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
  atomicLink.b.unit = lu.unitB;
  atomicLink.b.element = bElements[bond.indexB];
  if (!target.hasElement(atomicLink.b)) continue;
  + if (disjunct && structure.hasElement(atomicLink.b)) continue;
  atomicLink.a.unit = inputUnit;
  atomicLink.aIndex = inputIndex;
  @@ -316,6 +319,7 @@ export function isConnectedTo({ query, target, disjunct, invert, linkTest }: IsC
  const connCtx: IsConnectedToCtx = {
  queryCtx: ctx,
  input: ctx.inputStructure,
  + disjunct,
  target: StructureSelection.unionStructure(targetSel)
  }
  @@ -326,6 +330,8 @@ export function isConnectedTo({ query, target, disjunct, invert, linkTest }: IsC
  StructureSelection.forEach(selection, (s, sI) => {
  if (checkConnected(connCtx, s)) {
  ret.add(s);
  + } else if (invert) {
  + ret.add(s);
  }
  if (sI % 5 === 0) ctx.throwIfTimedOut();
  })
  