mirror of
				https://github.com/strapi/strapi.git
				synced 2025-11-03 19:36:20 +00:00 
			
		
		
		
	change firstSeen to mappedRelationsIndex
This commit is contained in:
		
							parent
							
								
									8bf254faac
								
							
						
					
					
						commit
						a05bdd83ae
					
				@ -25,39 +25,41 @@ const sortConnectArray = (connectArr, initialArr = [], strictSort = true) => {
 | 
			
		||||
  // Boolean to know if we have to recalculate the order of the relations
 | 
			
		||||
  let needsSorting = false;
 | 
			
		||||
  // Map to validate if relation is already in sortedConnect or DB.
 | 
			
		||||
  const relInArray = initialArr.reduce((acc, rel) => ({ ...acc, [rel.id]: true }), {});
 | 
			
		||||
  const relationInArray = initialArr.reduce((acc, rel) => ({ ...acc, [rel.id]: true }), {});
 | 
			
		||||
  // Map to store the first index where a relation id is connected
 | 
			
		||||
  const firstSeen = {};
 | 
			
		||||
  const mappedRelationsIndex = connectArr.reduce((mapper, relation, index) => {
 | 
			
		||||
    const adjacentRelId = relation.position?.before || relation.position?.after;
 | 
			
		||||
 | 
			
		||||
    if (!relationInArray[adjacentRelId] && !mapper[adjacentRelId]) {
 | 
			
		||||
      needsSorting = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      [relation.id]: mapper[relation.id] || index, // If the relation is already in the array, we keep the first index
 | 
			
		||||
      ...mapper,
 | 
			
		||||
    };
 | 
			
		||||
  }, {});
 | 
			
		||||
  // Map to validate if connect relation has already been computed
 | 
			
		||||
  const computedIdx = {};
 | 
			
		||||
 | 
			
		||||
  connectArr.forEach((rel, idx) => {
 | 
			
		||||
    // If adjacent relation is not in the database or seen yet in the connect array
 | 
			
		||||
    // then we need to sort the connect array
 | 
			
		||||
    const adjacentRelId = rel.position?.before || rel.position?.after;
 | 
			
		||||
    if (!relInArray[adjacentRelId] && !firstSeen[adjacentRelId]) needsSorting = true;
 | 
			
		||||
    // Populate firstSeen
 | 
			
		||||
    if (!(rel.id in firstSeen)) firstSeen[rel.id] = idx;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // If we don't need to sort the connect array, we can return it as is
 | 
			
		||||
  if (!needsSorting) return connectArr;
 | 
			
		||||
 | 
			
		||||
  // Add relation to sortedConnect and mark it as seen
 | 
			
		||||
  const pushRelation = (rel) => {
 | 
			
		||||
    sortedConnect.push(rel);
 | 
			
		||||
    relInArray[rel.id] = true;
 | 
			
		||||
  const pushRelation = (relation) => {
 | 
			
		||||
    sortedConnect.push(relation);
 | 
			
		||||
    relationInArray[relation.id] = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Recursively compute in which order the relation should be connected
 | 
			
		||||
  const computeRelation = (rel, idx, relationsSeenInBranch) => {
 | 
			
		||||
    const adjacentRelId = rel.position?.before || rel.position?.after;
 | 
			
		||||
  const computeRelation = (relation, idx, relationsSeenInBranch) => {
 | 
			
		||||
    const adjacentRelId = relation.position?.before || relation.position?.after;
 | 
			
		||||
 | 
			
		||||
    // This connect has already been computed
 | 
			
		||||
    if (idx in computedIdx) return;
 | 
			
		||||
 | 
			
		||||
    if (!adjacentRelId || relInArray[adjacentRelId]) {
 | 
			
		||||
      return pushRelation(rel);
 | 
			
		||||
    if (!adjacentRelId || relationInArray[adjacentRelId]) {
 | 
			
		||||
      return pushRelation(relation);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // If the relation has already been seen in the current branch,
 | 
			
		||||
@ -70,7 +72,7 @@ const sortConnectArray = (connectArr, initialArr = [], strictSort = true) => {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Look if id is referenced elsewhere in the array
 | 
			
		||||
    const adjacentRelIdx = firstSeen[adjacentRelId];
 | 
			
		||||
    const adjacentRelIdx = mappedRelationsIndex[adjacentRelId];
 | 
			
		||||
 | 
			
		||||
    if (adjacentRelIdx) {
 | 
			
		||||
      const adjacentRel = connectArr[adjacentRelIdx];
 | 
			
		||||
@ -78,25 +80,27 @@ const sortConnectArray = (connectArr, initialArr = [], strictSort = true) => {
 | 
			
		||||
      // Mark adjacent relation idx as computed,
 | 
			
		||||
      // so it is not computed again later in the loop
 | 
			
		||||
      computedIdx[adjacentRelIdx] = true;
 | 
			
		||||
      computeRelation(adjacentRel, idx, { ...relationsSeenInBranch, [rel.id]: true });
 | 
			
		||||
      pushRelation(rel);
 | 
			
		||||
      computeRelation(adjacentRel, idx, { ...relationsSeenInBranch, [relation.id]: true });
 | 
			
		||||
      pushRelation(relation);
 | 
			
		||||
    } else if (strictSort) {
 | 
			
		||||
      // If we reach this point, it means that the adjacent relation is not in the connect array
 | 
			
		||||
      // and it is not in the database. This should not happen.
 | 
			
		||||
      throw new InvalidRelationError(
 | 
			
		||||
        `There was a problem connecting relation with id ${rel.id} at position ${JSON.stringify(
 | 
			
		||||
          rel.position
 | 
			
		||||
        `There was a problem connecting relation with id ${
 | 
			
		||||
          relation.id
 | 
			
		||||
        } at position ${JSON.stringify(
 | 
			
		||||
          relation.position
 | 
			
		||||
        )}. The relation with id ${adjacentRelId} needs to be connected first.`
 | 
			
		||||
      );
 | 
			
		||||
    } else {
 | 
			
		||||
      // We are in non-strict mode so we can push the relation.
 | 
			
		||||
      pushRelation({ id: rel.id, position: { end: true } });
 | 
			
		||||
      pushRelation({ id: relation.id, position: { end: true } });
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Iterate over connectArr and populate sortedConnect
 | 
			
		||||
  connectArr.forEach((rel, idx) => {
 | 
			
		||||
    computeRelation(rel, idx, {});
 | 
			
		||||
  connectArr.forEach((relation, idx) => {
 | 
			
		||||
    computeRelation(relation, idx, {});
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return sortedConnect;
 | 
			
		||||
@ -184,8 +188,7 @@ const relationsOrderer = (initArr, idColumn, orderColumn, strict) => {
 | 
			
		||||
      return this;
 | 
			
		||||
    },
 | 
			
		||||
    connect(relations) {
 | 
			
		||||
      const sortedRelations = sortConnectArray(relations, arr, strict);
 | 
			
		||||
      sortedRelations.forEach((relation) => {
 | 
			
		||||
      sortConnectArray(_.castArray(relations), arr, strict).forEach((relation) => {
 | 
			
		||||
        this.disconnect(relation);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user