All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.molcikas.photon.query.PopulatedEntityMap Maven / Gradle / Ivy

package com.github.molcikas.photon.query;

import com.github.molcikas.photon.blueprints.entity.EntityBlueprint;
import com.github.molcikas.photon.blueprints.table.ColumnBlueprint;
import com.github.molcikas.photon.blueprints.entity.FieldBlueprint;

import java.util.*;
import java.util.stream.Collectors;

public class PopulatedEntityMap
{
    // TODO: Convert to multivalue map
    private final Map>> populatedEntityMap;
    private final Map childIndexes;

    public PopulatedEntityMap()
    {
        this.populatedEntityMap = new HashMap<>();
        this.childIndexes = new HashMap<>();
    }

    public List> getAllPopulatedEntities()
    {
        return populatedEntityMap
            .values()
            .stream()
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
    }

    public void createPopulatedEntity(EntityBlueprint entityBlueprint, PhotonQueryResultRow queryResultRow)
    {
        PopulatedEntity populatedEntity = new PopulatedEntity(entityBlueprint, queryResultRow);
        // 100 is the typical max length for an aggregate sub entity list.
        List> populatedEntities =
            populatedEntityMap.computeIfAbsent(entityBlueprint, k -> new ArrayList<>(100));
        populatedEntities.add(populatedEntity);
    }

    public List> getPopulatedEntitiesForBlueprint(EntityBlueprint entityBlueprint)
    {
        List> populatedEntities = populatedEntityMap.get(entityBlueprint);
        return populatedEntities != null ? Collections.unmodifiableList(populatedEntities) : Collections.emptyList();
    }

    public void setParentAndAddChildrenToCollection(Collection collection, EntityBlueprint entityBlueprint, PopulatedEntity parentPopulatedEntity)
    {
        PopulatedEntity populatedEntity = setParentAndGetNextChild(entityBlueprint, parentPopulatedEntity);

        while (populatedEntity != null)
        {
            collection.add(populatedEntity.getEntityInstance());
            populatedEntity = setParentAndGetNextChild(entityBlueprint, parentPopulatedEntity);
        }
    }

    public PopulatedEntity setParentAndGetNextChild(EntityBlueprint entityBlueprint, PopulatedEntity parentPopulatedEntity)
    {
        Integer index = childIndexes.get(entityBlueprint);
        List> populatedEntities = populatedEntityMap.get(entityBlueprint);
        if(populatedEntities == null)
        {
            return null;
        }
        if (index == null)
        {
            index = 0;
        }
        if (index < populatedEntities.size() && keysAreEqual(parentPopulatedEntity.getPrimaryKeyValue(), populatedEntities.get(index).getForeignKeyToParentValue()))
        {
            childIndexes.put(entityBlueprint, index + 1);
            PopulatedEntity populatedEntity = populatedEntities.get(index);
            populatedEntity.setParentPopulatedEntity(parentPopulatedEntity);
            return populatedEntity;
        }
        return null;
    }

    public void mapAllEntityInstanceChildren()
    {
        populatedEntityMap
            .values()
            .forEach(populatedEntities -> populatedEntities.forEach(populatedEntity -> populatedEntity.mapEntityInstanceChildren(this)));
    }

    public void setFieldValuesOnEntityInstances(List photonQueryResultRows, FieldBlueprint fieldBlueprint, EntityBlueprint entityBlueprint)
    {
        ColumnBlueprint primaryKeyColumn = entityBlueprint.getTableBlueprint().getPrimaryKeyColumn();
        List> populatedEntities = populatedEntityMap.get(entityBlueprint);
        String foreignTableKeyColumnName = fieldBlueprint.getFlattenedCollectionBlueprint().getColumnName();

        int entityIndex = 0;
        for(PhotonQueryResultRow photonQueryResultRow : photonQueryResultRows)
        {
            Object primaryKeyValue = photonQueryResultRow.getValue(primaryKeyColumn.getColumnName());
            while(entityIndex < populatedEntities.size() && !keysAreEqual(primaryKeyValue, populatedEntities.get(entityIndex).getPrimaryKeyValue()))
            {
                entityIndex++;
            }
            if(entityIndex >= populatedEntities.size())
            {
                break;
            }
            PopulatedEntity populatedEntity = populatedEntities.get(entityIndex);
            populatedEntity.appendValueToFlattenedCollectionField(fieldBlueprint, photonQueryResultRow.getValue(foreignTableKeyColumnName));
        }
    }

    private boolean keysAreEqual(Object primaryKey, Object foreignKey)
    {
        if(primaryKey.equals(foreignKey))
        {
            return true;
        }

        if (primaryKey instanceof byte[] && foreignKey instanceof byte[])
        {
            return Arrays.equals((byte[]) primaryKey, (byte[]) foreignKey);
        }

        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy