Skip to content

Commit

Permalink
Runtime: Change API for backward streaming
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Forslund committed Sep 27, 2016
1 parent 1490fc7 commit 1710b0f
Show file tree
Hide file tree
Showing 18 changed files with 351 additions and 167 deletions.
1 change: 0 additions & 1 deletion runtime/dependency-reduced-pom.xml
Expand Up @@ -23,7 +23,6 @@
com.speedment.runtime.component.*, com.speedment.runtime.component.*,
com.speedment.runtime.config.*, com.speedment.runtime.config.*,
com.speedment.runtime.db.*, com.speedment.runtime.db.*,
com.speedment.runtime.entity.*,
com.speedment.runtime.exception.*, com.speedment.runtime.exception.*,
com.speedment.runtime.field.*, com.speedment.runtime.field.*,
com.speedment.runtime.license.*, com.speedment.runtime.license.*,
Expand Down

This file was deleted.

@@ -0,0 +1,65 @@
/*
* Copyright (c) Emil Forslund, 2016.
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Emil Forslund and his suppliers, if any.
* The intellectual and technical concepts contained herein
* are proprietary to Emil Forslund and his suppliers and may
* be covered by U.S. and Foreign Patents, patents in process,
* and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this
* material is strictly forbidden unless prior written
* permission is obtained from Emil Forslund himself.
*/
package com.speedment.runtime.field.method;

import com.speedment.runtime.field.trait.HasFinder;
import com.speedment.runtime.manager.Manager;
import java.util.function.Function;
import java.util.stream.Stream;

/**
* An operation that can produce a {@code Stream} of foreign entities given a
* single entity. This is useful since it can be passed to an outer stream as
* the argument for a {@code flatMap()}-operation.
* <p>
* Each streamer contains metadata of which fields it compares to determine the
* mapping as well as a reference to the foreign manager.
* <p>
* Streamers have the following signature:
* {@code
* Stream<FK_ENTITY> apply(ENTITY entity);
* }
*
* @param <ENTITY> the source entity
* @param <FK_ENTITY> the target entity
* @param <V> the wrapper type
*
* @author Emil Forslund
* @since 3.0.1
*/
public interface BackwardFinder<ENTITY, FK_ENTITY, V>
extends Function<ENTITY, Stream<FK_ENTITY>> {

/**
* Returns the field that the stream references.
* <p>
* In the following example, {@code bar} is the target:
* {@code
* foos.stream()
* .flatMap(foo.findBars()) // findBars returns Streamer<Foo, Bar>
* .forEach(...);
* }
*
* @return the target field
*/
HasFinder<FK_ENTITY, ENTITY, V> getField();

/**
* Returns the manager used for the referenced (foreign) table.
*
* @return target (foreign) manager
*/
Manager<FK_ENTITY> getTargetManager();
}
@@ -0,0 +1,77 @@
/**
*
* Copyright (c) 2006-2016, Speedment, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); You may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.speedment.runtime.field.method;

import com.speedment.runtime.field.Field;
import com.speedment.runtime.manager.Manager;
import java.util.function.Function;

/**
* A handle for a find-operation that can be replaced runtime to optimize a
* {@code Stream}. Formally, a {@code FindFrom} has the following signature:
* {@code
* FK_ENTITY apply(ENTITY entity);
* }
* <p>
* Each {@code FindFrom} contains metadata of which fields it compares to
* determine the mapping as well as a reference to the foreign manager.
*
* @param <ENTITY> the source entity
* @param <FK_ENTITY> the target entity
* @param <V> the wrapper type
*
* @author Emil Forslund
* @since 3.0.0
*/
public interface FindFrom<ENTITY, FK_ENTITY, V> extends Function<ENTITY, FK_ENTITY> {

/**
* Returns the field that the stream originates from.
* <p>
* In the following example, {@code foo} is the source:
* {@code
* foos.stream()
* .flatMap(foo.findBars()) // findBars returns Streamer<Foo, Bar>
* .forEach(...);
* }
*
* @return the source field
*/
Field<ENTITY, V> getSourceField();

/**
* Returns the field that the stream references.
* <p>
* In the following example, {@code bar} is the target:
* {@code
* foos.stream()
* .flatMap(foo.findBars()) // findBars returns Streamer<Foo, Bar>
* .forEach(...);
* }
*
* @return the target field
*/
Field<FK_ENTITY, V> getTargetField();

/**
* Returns the manager used for the referenced (foreign) table.
*
* @return target (foreign) manager
*/
Manager<FK_ENTITY> getTargetManager();

}

This file was deleted.

Expand Up @@ -17,9 +17,10 @@
package com.speedment.runtime.field.trait; package com.speedment.runtime.field.trait;


import com.speedment.runtime.annotation.Api; import com.speedment.runtime.annotation.Api;
import com.speedment.runtime.field.finder.FindFrom; import com.speedment.runtime.field.Field;
import com.speedment.runtime.field.method.FindFrom;
import com.speedment.runtime.manager.Manager; import com.speedment.runtime.manager.Manager;
import com.speedment.runtime.field.method.Finder; import com.speedment.runtime.field.method.BackwardFinder;


/** /**
* A representation of an Entity field that use a foreign key to * A representation of an Entity field that use a foreign key to
Expand All @@ -35,14 +36,13 @@
*/ */
@Api(version = "3.0") @Api(version = "3.0")
public interface HasFinder<ENTITY, FK_ENTITY, V> { public interface HasFinder<ENTITY, FK_ENTITY, V> {

/** /**
* Returns a function that can find a foreign entity pointed out by this * Returns the field referenced by this finder.
* field. *
* * @return the referenced field
* @return the finder
*/ */
Finder<ENTITY, FK_ENTITY> finder(); Field<FK_ENTITY, V> getReferencedField();


/** /**
* Returns a function that can be used to find referenced entites using the * Returns a function that can be used to find referenced entites using the
Expand All @@ -51,16 +51,14 @@ public interface HasFinder<ENTITY, FK_ENTITY, V> {
* @param foreignManager the foreign manager * @param foreignManager the foreign manager
* @return finder method * @return finder method
*/ */
FindFrom<ENTITY, FK_ENTITY, V> findFrom(Manager<FK_ENTITY> foreignManager); FindFrom<ENTITY, FK_ENTITY, V> finder(Manager<FK_ENTITY> foreignManager);

/** /**
* Finds the foreign entity associated by this field. * Returns a function that can be used to find a stream of entities
* * referencing this entity using the specified manager.
* @param entity this entity *
* @param foreignManager the foreign manager * @param manager the foreign manager
* @return the foreign entity associated by this field * @return streaming method
*/ */
default FK_ENTITY findFrom(ENTITY entity, Manager<FK_ENTITY> foreignManager) { BackwardFinder<FK_ENTITY, ENTITY, V> backwardFinder(Manager<ENTITY> manager);
return finder().apply(entity, foreignManager);
}
} }
Expand Up @@ -4,9 +4,10 @@
import com.speedment.runtime.config.mapper.TypeMapper; import com.speedment.runtime.config.mapper.TypeMapper;
import com.speedment.runtime.field.ByteField; import com.speedment.runtime.field.ByteField;
import com.speedment.runtime.field.ByteForeignKeyField; import com.speedment.runtime.field.ByteForeignKeyField;
import com.speedment.runtime.field.finder.FindFrom; import com.speedment.runtime.field.method.BackwardFinder;
import com.speedment.runtime.field.method.ByteGetter; import com.speedment.runtime.field.method.ByteGetter;
import com.speedment.runtime.field.method.ByteSetter; import com.speedment.runtime.field.method.ByteSetter;
import com.speedment.runtime.field.method.FindFrom;
import com.speedment.runtime.field.method.Finder; import com.speedment.runtime.field.method.Finder;
import com.speedment.runtime.field.predicate.FieldPredicate; import com.speedment.runtime.field.predicate.FieldPredicate;
import com.speedment.runtime.field.predicate.Inclusion; import com.speedment.runtime.field.predicate.Inclusion;
Expand All @@ -18,6 +19,7 @@
import com.speedment.runtime.internal.field.predicate.bytes.ByteGreaterOrEqualPredicate; import com.speedment.runtime.internal.field.predicate.bytes.ByteGreaterOrEqualPredicate;
import com.speedment.runtime.internal.field.predicate.bytes.ByteGreaterThanPredicate; import com.speedment.runtime.internal.field.predicate.bytes.ByteGreaterThanPredicate;
import com.speedment.runtime.internal.field.predicate.bytes.ByteInPredicate; import com.speedment.runtime.internal.field.predicate.bytes.ByteInPredicate;
import com.speedment.runtime.internal.field.streamer.BackwardFinderImpl;
import com.speedment.runtime.manager.Manager; import com.speedment.runtime.manager.Manager;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
Expand Down Expand Up @@ -67,13 +69,18 @@ public ByteGetter<ENTITY> getter() {
} }


@Override @Override
public FindFrom<ENTITY, FK_ENTITY, Byte> findFrom(Manager<FK_ENTITY> foreignManager) { public ByteField<FK_ENTITY, ?> getReferencedField() {
return new FindFromByte<>(this, referenced, foreignManager); return referenced;
} }


@Override @Override
public Finder<ENTITY, FK_ENTITY> finder() { public BackwardFinder<FK_ENTITY, ENTITY, Byte> backwardFinder(Manager<ENTITY> manager) {
return finder; return new BackwardFinderImpl<>(this, manager);
}

@Override
public FindFrom<ENTITY, FK_ENTITY, Byte> finder(Manager<FK_ENTITY> foreignManager) {
return new FindFromByte<>(this, referenced, foreignManager);
} }


@Override @Override
Expand Down
Expand Up @@ -4,9 +4,10 @@
import com.speedment.runtime.config.mapper.TypeMapper; import com.speedment.runtime.config.mapper.TypeMapper;
import com.speedment.runtime.field.CharField; import com.speedment.runtime.field.CharField;
import com.speedment.runtime.field.CharForeignKeyField; import com.speedment.runtime.field.CharForeignKeyField;
import com.speedment.runtime.field.finder.FindFrom; import com.speedment.runtime.field.method.BackwardFinder;
import com.speedment.runtime.field.method.CharGetter; import com.speedment.runtime.field.method.CharGetter;
import com.speedment.runtime.field.method.CharSetter; import com.speedment.runtime.field.method.CharSetter;
import com.speedment.runtime.field.method.FindFrom;
import com.speedment.runtime.field.method.Finder; import com.speedment.runtime.field.method.Finder;
import com.speedment.runtime.field.predicate.FieldPredicate; import com.speedment.runtime.field.predicate.FieldPredicate;
import com.speedment.runtime.field.predicate.Inclusion; import com.speedment.runtime.field.predicate.Inclusion;
Expand All @@ -18,6 +19,7 @@
import com.speedment.runtime.internal.field.predicate.chars.CharGreaterOrEqualPredicate; import com.speedment.runtime.internal.field.predicate.chars.CharGreaterOrEqualPredicate;
import com.speedment.runtime.internal.field.predicate.chars.CharGreaterThanPredicate; import com.speedment.runtime.internal.field.predicate.chars.CharGreaterThanPredicate;
import com.speedment.runtime.internal.field.predicate.chars.CharInPredicate; import com.speedment.runtime.internal.field.predicate.chars.CharInPredicate;
import com.speedment.runtime.internal.field.streamer.BackwardFinderImpl;
import com.speedment.runtime.manager.Manager; import com.speedment.runtime.manager.Manager;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
Expand Down Expand Up @@ -67,13 +69,18 @@ public CharGetter<ENTITY> getter() {
} }


@Override @Override
public FindFrom<ENTITY, FK_ENTITY, Character> findFrom(Manager<FK_ENTITY> foreignManager) { public CharField<FK_ENTITY, ?> getReferencedField() {
return new FindFromChar<>(this, referenced, foreignManager); return referenced;
} }


@Override @Override
public Finder<ENTITY, FK_ENTITY> finder() { public BackwardFinder<FK_ENTITY, ENTITY, Character> backwardFinder(Manager<ENTITY> manager) {
return finder; return new BackwardFinderImpl<>(this, manager);
}

@Override
public FindFrom<ENTITY, FK_ENTITY, Character> finder(Manager<FK_ENTITY> foreignManager) {
return new FindFromChar<>(this, referenced, foreignManager);
} }


@Override @Override
Expand Down

0 comments on commit 1710b0f

Please sign in to comment.