2020-11-11 16:51:59 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "MetasoundFrontendQuerySteps.h"
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
|
|
|
|
#include "MetasoundFrontend.h"
|
2021-01-13 10:48:59 -04:00
|
|
|
#include "MetasoundFrontendDocument.h"
|
2021-03-30 18:22:10 -04:00
|
|
|
#include "MetasoundFrontendRegistryTransaction.h"
|
2020-11-11 16:51:59 -04:00
|
|
|
|
|
|
|
|
namespace Metasound
|
|
|
|
|
{
|
2021-05-27 14:45:41 -04:00
|
|
|
FNodeClassRegistrationEvents::FNodeClassRegistrationEvents()
|
2021-03-30 18:22:10 -04:00
|
|
|
: CurrentTransactionID(Frontend::GetOriginRegistryTransactionID())
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FNodeClassRegistrationEvents::Stream(TArray<FFrontendQueryEntry>& OutEntries)
|
2021-03-30 18:22:10 -04:00
|
|
|
{
|
2021-06-09 18:20:38 -04:00
|
|
|
using namespace Frontend;
|
2021-03-30 18:22:10 -04:00
|
|
|
|
2021-06-09 18:20:38 -04:00
|
|
|
const TArray<const IRegistryTransaction*> Transactions = GetRegistryTransactionsSince(CurrentTransactionID, &CurrentTransactionID);
|
|
|
|
|
|
|
|
|
|
for (const IRegistryTransaction* Transaction : Transactions)
|
2021-03-30 18:22:10 -04:00
|
|
|
{
|
2021-06-09 18:20:38 -04:00
|
|
|
if (const FNodeClassInfo* Info = Transaction->GetNodeClassInfo())
|
|
|
|
|
{
|
|
|
|
|
FFrontendQueryEntry::FValue Value(TInPlaceType<const IRegistryTransaction*>(), Transaction);
|
|
|
|
|
OutEntries.Emplace(MoveTemp(Value));
|
|
|
|
|
}
|
2021-03-30 18:22:10 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FNodeClassRegistrationEvents::Reset()
|
|
|
|
|
{
|
|
|
|
|
CurrentTransactionID = Frontend::GetOriginRegistryTransactionID();
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-09 18:20:38 -04:00
|
|
|
FFrontendQueryEntry::FKey FMapRegistrationEventsToNodeRegistryKeys::Map(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
|
|
|
|
using namespace Frontend;
|
|
|
|
|
|
|
|
|
|
FNodeRegistryKey RegistryKey;
|
|
|
|
|
|
|
|
|
|
if (ensure(InEntry.Value.IsType<const IRegistryTransaction*>()))
|
|
|
|
|
{
|
|
|
|
|
if (const IRegistryTransaction* Transaction = InEntry.Value.Get<const IRegistryTransaction*>())
|
|
|
|
|
{
|
2021-06-14 16:46:19 -04:00
|
|
|
const FNodeRegistryKey* Key = Transaction->GetNodeRegistryKey();
|
|
|
|
|
if (nullptr != Key)
|
2021-06-09 18:20:38 -04:00
|
|
|
{
|
2021-06-14 16:46:19 -04:00
|
|
|
RegistryKey = *Key;
|
2021-06-09 18:20:38 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-10 10:03:24 -04:00
|
|
|
return FFrontendQueryEntry::FKey(RegistryKey);
|
2021-06-09 18:20:38 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FReduceRegistrationEventsToCurrentStatus::Reduce(FFrontendQueryEntry::FKey InKey, TArrayView<FFrontendQueryEntry * const>& InEntries, FReduceOutputView& OutResult) const
|
|
|
|
|
{
|
|
|
|
|
using namespace Frontend;
|
|
|
|
|
|
|
|
|
|
int32 State = 0;
|
|
|
|
|
FFrontendQueryEntry* FinalEntry = nullptr;
|
|
|
|
|
|
|
|
|
|
for (FFrontendQueryEntry* Entry : InEntries)
|
|
|
|
|
{
|
|
|
|
|
if (ensure(Entry->Value.IsType<const IRegistryTransaction*>()))
|
|
|
|
|
{
|
|
|
|
|
if (const IRegistryTransaction* Transaction = Entry->Value.Get<const IRegistryTransaction*>())
|
|
|
|
|
{
|
|
|
|
|
switch (Transaction->GetTransactionType())
|
|
|
|
|
{
|
|
|
|
|
case ETransactionType::Add:
|
|
|
|
|
State++;
|
|
|
|
|
FinalEntry = Entry;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case ETransactionType::Remove:
|
|
|
|
|
State--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((nullptr != FinalEntry) && (State > 0))
|
|
|
|
|
{
|
|
|
|
|
OutResult.Add(*FinalEntry);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FTransformRegistrationEventsToClasses::Transform(FFrontendQueryEntry::FValue& InValue) const
|
|
|
|
|
{
|
|
|
|
|
using namespace Frontend;
|
|
|
|
|
|
|
|
|
|
FMetasoundFrontendClass FrontendClass;
|
|
|
|
|
|
|
|
|
|
if (ensure(InValue.IsType<const IRegistryTransaction*>()))
|
|
|
|
|
{
|
|
|
|
|
if (const IRegistryTransaction* Transaction = InValue.Get<const IRegistryTransaction*>())
|
|
|
|
|
{
|
2021-06-14 16:46:19 -04:00
|
|
|
const FNodeRegistryKey* Key = Transaction->GetNodeRegistryKey();
|
|
|
|
|
if (nullptr != Key)
|
2021-06-09 18:20:38 -04:00
|
|
|
{
|
2021-06-14 16:46:19 -04:00
|
|
|
bool bSuccess = FMetasoundFrontendRegistryContainer::Get()->FindFrontendClassFromRegistered(*Key, FrontendClass);
|
2021-06-09 18:20:38 -04:00
|
|
|
check(bSuccess);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InValue.Set<FMetasoundFrontendClass>(MoveTemp(FrontendClass));
|
|
|
|
|
}
|
|
|
|
|
|
2020-11-11 16:51:59 -04:00
|
|
|
FFilterClassesByInputVertexDataType::FFilterClassesByInputVertexDataType(const FName& InTypeName)
|
|
|
|
|
: InputVertexTypeName(InTypeName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByInputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-13 10:48:59 -04:00
|
|
|
check(InEntry.Value.IsType<FMetasoundFrontendClass>());
|
2020-11-11 16:51:59 -04:00
|
|
|
|
2021-01-13 10:48:59 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Interface.Inputs.ContainsByPredicate(
|
|
|
|
|
[this](const FMetasoundFrontendClassInput& InDesc)
|
2020-11-11 16:51:59 -04:00
|
|
|
{
|
|
|
|
|
return InDesc.TypeName == InputVertexTypeName;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FFilterClassesByOutputVertexDataType::FFilterClassesByOutputVertexDataType(const FName& InTypeName)
|
|
|
|
|
: OutputVertexTypeName(InTypeName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByOutputVertexDataType::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-13 10:48:59 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Interface.Outputs.ContainsByPredicate(
|
|
|
|
|
[this](const FMetasoundFrontendClassOutput& InDesc)
|
2020-11-11 16:51:59 -04:00
|
|
|
{
|
|
|
|
|
return InDesc.TypeName == OutputVertexTypeName;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-28 19:02:51 -04:00
|
|
|
FFilterClassesByClassName::FFilterClassesByClassName(const FMetasoundFrontendClassName& InClassName)
|
2021-01-22 03:05:22 -04:00
|
|
|
: ClassName(InClassName)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByClassName::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
2021-01-28 19:02:51 -04:00
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().Metadata.ClassName == ClassName;
|
2021-01-22 03:05:22 -04:00
|
|
|
}
|
2021-03-09 00:27:55 -04:00
|
|
|
|
|
|
|
|
FFilterClassesByClassID::FFilterClassesByClassID(const FGuid InClassID)
|
|
|
|
|
: ClassID(InClassID)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FFilterClassesByClassID::Filter(const FFrontendQueryEntry& InEntry) const
|
|
|
|
|
{
|
|
|
|
|
return InEntry.Value.Get<FMetasoundFrontendClass>().ID == ClassID;
|
|
|
|
|
}
|
2020-11-11 16:51:59 -04:00
|
|
|
|
2021-06-09 18:20:38 -04:00
|
|
|
FFrontendQueryEntry::FKey FMapToFullClassName::Map(const FFrontendQueryEntry& InEntry) const
|
2021-05-03 17:52:04 -04:00
|
|
|
{
|
|
|
|
|
const FMetasoundFrontendClass& FrontendClass = InEntry.Value.Get<FMetasoundFrontendClass>();
|
2021-06-09 18:20:38 -04:00
|
|
|
return FFrontendQueryEntry::FKey(FrontendClass.Metadata.ClassName.GetFullName());
|
2021-05-03 17:52:04 -04:00
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FReduceClassesToHighestVersion::Reduce(FFrontendQueryEntry::FKey InKey, TArrayView<FFrontendQueryEntry * const>& InEntries, FReduceOutputView& OutResult) const
|
2021-05-03 17:52:04 -04:00
|
|
|
{
|
|
|
|
|
FFrontendQueryEntry* HighestVersionEntry = nullptr;
|
|
|
|
|
int32 HighestMajorVersion = -1;
|
|
|
|
|
|
|
|
|
|
for (FFrontendQueryEntry* Entry : InEntries)
|
|
|
|
|
{
|
|
|
|
|
const int32 EntryMajorVersion = Entry->Value.Get<FMetasoundFrontendClass>().Metadata.Version.Major;
|
|
|
|
|
|
|
|
|
|
if (!HighestVersionEntry || HighestMajorVersion < EntryMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
HighestVersionEntry = Entry;
|
|
|
|
|
HighestMajorVersion = EntryMajorVersion;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-04 00:03:58 -04:00
|
|
|
if (HighestVersionEntry)
|
|
|
|
|
{
|
|
|
|
|
OutResult.Add(*HighestVersionEntry);
|
|
|
|
|
}
|
2021-05-03 17:52:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FReduceClassesToMajorVersion::FReduceClassesToMajorVersion(int32 InMajorVersion)
|
|
|
|
|
: MajorVersion(InMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-27 14:45:41 -04:00
|
|
|
void FReduceClassesToMajorVersion::Reduce(FFrontendQueryEntry::FKey InKey, TArrayView<FFrontendQueryEntry * const>& InEntries, FReduceOutputView& OutResult) const
|
2021-05-03 17:52:04 -04:00
|
|
|
{
|
|
|
|
|
for (FFrontendQueryEntry* Entry : InEntries)
|
|
|
|
|
{
|
|
|
|
|
const int32 EntryMajorVersion = Entry->Value.Get<FMetasoundFrontendClass>().Metadata.Version.Major;
|
|
|
|
|
if (MajorVersion == EntryMajorVersion)
|
|
|
|
|
{
|
|
|
|
|
OutResult.Add(*Entry);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool FSortClassesByVersion::Sort(const FFrontendQueryEntry& InEntryLHS, const FFrontendQueryEntry& InEntryRHS) const
|
|
|
|
|
{
|
|
|
|
|
const FMetasoundFrontendVersionNumber& VersionLHS = InEntryLHS.Value.Get<FMetasoundFrontendClass>().Metadata.Version;
|
|
|
|
|
const FMetasoundFrontendVersionNumber& VersionRHS = InEntryRHS.Value.Get<FMetasoundFrontendClass>().Metadata.Version;
|
|
|
|
|
return VersionLHS > VersionRHS;
|
|
|
|
|
}
|
|
|
|
|
}
|