forked from apache/predictionio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
EntityMap.scala
98 lines (71 loc) · 2.7 KB
/
EntityMap.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/** Copyright 2015 TappingStone, Inc.
*
* 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:https://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 io.prediction.data.storage
import io.prediction.annotation.Experimental
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
/**
* :: Experimental ::
*/
@Experimental
class EntityIdIxMap(val idToIx: BiMap[String, Long]) extends Serializable {
val ixToId: BiMap[Long, String] = idToIx.inverse
def apply(id: String): Long = idToIx(id)
def apply(ix: Long): String = ixToId(ix)
def contains(id: String): Boolean = idToIx.contains(id)
def contains(ix: Long): Boolean = ixToId.contains(ix)
def get(id: String): Option[Long] = idToIx.get(id)
def get(ix: Long): Option[String] = ixToId.get(ix)
def getOrElse(id: String, default: => Long): Long =
idToIx.getOrElse(id, default)
def getOrElse(ix: Long, default: => String): String =
ixToId.getOrElse(ix, default)
def toMap: Map[String, Long] = idToIx.toMap
def size: Long = idToIx.size
def take(n: Int): EntityIdIxMap = new EntityIdIxMap(idToIx.take(n))
override def toString: String = idToIx.toString
}
/** :: Experimental :: */
@Experimental
object EntityIdIxMap {
def apply(keys: RDD[String]): EntityIdIxMap = {
new EntityIdIxMap(BiMap.stringLong(keys))
}
}
/** :: Experimental :: */
@Experimental
class EntityMap[A](val idToData: Map[String, A],
override val idToIx: BiMap[String, Long]) extends EntityIdIxMap(idToIx) {
def this(idToData: Map[String, A]) = this(
idToData,
BiMap.stringLong(idToData.keySet)
)
def data(id: String): A = idToData(id)
def data(ix: Long): A = idToData(ixToId(ix))
def getData(id: String): Option[A] = idToData.get(id)
def getData(ix: Long): Option[A] = idToData.get(ixToId(ix))
def getOrElseData(id: String, default: => A): A =
getData(id).getOrElse(default)
def getOrElseData(ix: Long, default: => A): A =
getData(ix).getOrElse(default)
override def take(n: Int): EntityMap[A] = {
val newIdToIx = idToIx.take(n)
new EntityMap[A](idToData.filterKeys(newIdToIx.contains(_)), newIdToIx)
}
override def toString: String = {
s"idToData: ${idToData.toString} " + s"idToix: ${idToIx.toString}"
}
}