From bc85c2a158d3a11f0b8fd3aacc36e6f987ab9dd7 Mon Sep 17 00:00:00 2001 From: erwinwinder Date: Thu, 16 Jan 2014 09:52:33 +0100 Subject: [PATCH] Added molgenis-data-omx documentation --- molgenis-data-omx/doc/molgenis-data-omx.dia | Bin 0 -> 2875 bytes molgenis-data-omx/doc/molgenis-data-omx.md | 36 ++++++++++++++++++++ molgenis-data-omx/doc/molgenis-data-omx.png | Bin 0 -> 22764 bytes 3 files changed, 36 insertions(+) create mode 100644 molgenis-data-omx/doc/molgenis-data-omx.dia create mode 100644 molgenis-data-omx/doc/molgenis-data-omx.md create mode 100644 molgenis-data-omx/doc/molgenis-data-omx.png diff --git a/molgenis-data-omx/doc/molgenis-data-omx.dia b/molgenis-data-omx/doc/molgenis-data-omx.dia new file mode 100644 index 0000000000000000000000000000000000000000..df4c6b7b31c38586c6c5e000dd65716d2c221956 GIT binary patch literal 2875 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 literal 0 HcmV?d00001 diff --git a/molgenis-data-omx/doc/molgenis-data-omx.md b/molgenis-data-omx/doc/molgenis-data-omx.md new file mode 100644 index 00000000000..55b7f7ff8ed --- /dev/null +++ b/molgenis-data-omx/doc/molgenis-data-omx.md @@ -0,0 +1,36 @@ +## Introduction +The molgenis-data-omx package is data backend for Molgenis that uses observe omx `DataSet` matrices. It provides repository wrappers around DataSets so that they can be used like any other repository. The attributes of the repository are the `ObservableFeatures` of the `Protocol` used by the `DataSet`. The values of an entity are the `ObservedValues` of an `ObservationSet` that belongs to the `DataSet`. So one `ObservationSet` represents one `Entity` + +This package depends on molgenis-omx-core, molgenis-data-jpa and molgenis-search. + +## Core molgenis-data-omx classes + + + +**The light grey classes are provided by other molgenis modules** + +### OmxRepository + +`Repository` implementation for an omx `DataSet` matrix. For each `DataSet` there is an `OmxRepository`, the `SearchService` is used to retrieve the attribute values of an entity. So an index needs to be in place to be able to use an `OmxRepository`. The `OmxRepository` uses the `SearchService` for querying and iterating. + +The `OmxRepository` methods returns `MapEntities` as the `Entity` implementation. It implements the `Queryable` interface so you can query it but you can't add, update or delete entities with it. + +The entitynames are the identifiers of the available `DataSets`. The attributenames are de identifiers of the `ObservableFeatures`. + +### OmxEntitySource +There is only one `OmxEntitySource` in an application with url `omx://`. + +### OmxEntitySourceFactory +There can be only one `OmxEntitySourceFactory` in an application, it has the urlprefix `omx://`. + +### OmxDataConfig +This is the spring configuration class for the molgenis-data-omx package. It adds the `OmxEntitySource` and `OmxEntitySourceFactory` to the spring applicationcontext and registers the omx entitysource as a databackend at the `DataService`. + +So when you import tis class in your configuration class or this class is in the componentscan, you automatically can use the omx data classes. + + + + + + + diff --git a/molgenis-data-omx/doc/molgenis-data-omx.png b/molgenis-data-omx/doc/molgenis-data-omx.png new file mode 100644 index 0000000000000000000000000000000000000000..446fd035813c23f9ec5645777fa3dfa6f1756ad8 GIT binary patch literal 22764 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