+ protected KeyStatement createEmptyDeclared(final StmtContext<Set<QName>, KeyStatement, ?> ctx) {
+ return new EmptyKeyStatement(ctx.coerceRawStatementArgument(), ctx.coerceStatementArgument());
+ }
+
+ @Override
+ protected KeyEffectiveStatement createEffective(
+ final StmtContext<Set<QName>, KeyStatement, KeyEffectiveStatement> ctx, final KeyStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ final Set<QName> arg = ctx.coerceStatementArgument();
+ return arg.equals(declared.argument()) ? new RegularLocalKeyEffectiveStatement(declared, substatements)
+ : new RegularForeignKeyEffectiveStatement(declared, arg, substatements);
+ }
+
+ @Override
+ protected KeyEffectiveStatement createEmptyEffective(
+ final StmtContext<Set<QName>, KeyStatement, KeyEffectiveStatement> ctx, final KeyStatement declared) {
+ final Set<QName> arg = ctx.coerceStatementArgument();
+ return arg.equals(declared.argument()) ? new EmptyLocalKeyEffectiveStatement(declared)
+ : new EmptyForeignKeyEffectiveStatement(declared, arg);
+ }
+
+ static @NonNull Object maskSet(final @NonNull Set<QName> set) {
+ return set.size() == 1 ? set.iterator().next() : set;
+ }
+
+ @SuppressWarnings("unchecked")
+ static @NonNull Set<QName> unmaskSet(final @NonNull Object masked) {
+ if (masked instanceof Set) {
+ return (Set<QName>) masked;
+ }
+ verify(masked instanceof QName, "Unexpected argument %s", masked);
+ return ImmutableSet.of((QName) masked);