Part 5 Searching in databases
No edit summary
(Automatically adding template at the end of the page.)
 
(15 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<html>  
<html>
<h5> We create a seeker that translates ocl to sql for searching in databases of any size.
<h4> We created a Seeker that translates OCL to SQL for searching in databases of any size. We look at derivations, constraints,
We look at derivations, constraints and validation rules. </h5>
  and validation rules. </h4>


<p>
<p class="video-warn">
<em>To make your experience more comfortable, we set the main tags mentioned in the video to the right bar menu of this mini player. Choose the interesting subtitle on the list and immediately get to the exact theme timeplace in the video. Now you can pick any topic to be instructed without watching the whole video.</em>
  <em>To make your experience smooth, we set the main tags mentioned in the video to the right bar menu of this mini-player. Choose an interesting subtitle on the list and immediately get to the exact theme navigation item place in the video. Now you can pick any topic to be instructed on without watching the whole video.</em>
<style type="text/css">
p {
opacity: 0.7;
text-align: justify;
width: 90%
}
</style>
</p>
</p>


<style>
<div class="video">
#video12 {
   <div class="video__wrapper">
   position: relative;
   <iframe src="https://www.youtube.com/embed/qRAsgCNKM08?rel=0&autoplay=0" frameborder="0" allowfullscreen></iframe>
   height: 500px;
</div>
  width:560px;
<div class="video__navigation">
  padding-bottom: 10px;
    <strong>View Model Editor:</strong>
}
    <span class="navigation-item" data-video="qRAsgCNKM08" data-start="175" tabindex="0"> Search expressions </span>
#video12 iframe {
    <span class="navigation-item" data-video="qRAsgCNKM08" data-start="241" tabindex="0"> Variables and Validations </span>
  position: absolute;
    <span class="navigation-item" data-video="qRAsgCNKM08" data-start="521" tabindex="0"> Derivation Attribute </span>
  min-height: auto;
     <span class="navigation-item" data-video="qRAsgCNKM08" data-start="1395" tabindex="0"> Visible expressions </span>
  min-width: auto;
     </br> <strong>Test data:</strong>
}
     <span class="navigation-item" data-video="qRAsgCNKM08" data-start="2323" tabindex="0"> Tab separated data import </span>
#video12 div {
     <span class="navigation-item" data-video="qRAsgCNKM08" data-start="2383" tabindex="0"> Constraints </span>
  position: absolute;
    <span class="navigation-item" data-video="qRAsgCNKM08" data-start="2553" tabindex="0"> Validation Rules </span>
  top: 0;
    <span class="navigation-item" data-video="qRAsgCNKM08" data-start="2881" tabindex="0"> Saving despite error warnings </span>
  left:760px;
  width: 260px;
  height: 100%;
  padding-left: 10px;
  overflow-y: auto;
}
span {
     font-size: 18;
     display:block;
  padding: 2px 10px 2px 10px;
     padding-bottom: 0.5;
     padding-top: 0.5;
  opacity: 0.7;
}
span:hover {
  color: #0000FF;
  cursor: pointer;
}
span:focus {
  color: blue;
</style>


<div id="video12">
<iframe width="740" height="500" src="https://www.youtube.com/embed/BhKRj3-LoBI?rel=0&autoplay=0" frameborder="0" allowfullscreen></iframe>
  <div>
  <strong>View Model Editor:</strong>
    <span data-video="BhKRj3-LoBI" data-start="170" tabindex="0">Search expressions </span>
    <span data-video="BhKRj3-LoBI" data-start="236" tabindex="0">Variables and Validations </span>
    <span data-video="BhKRj3-LoBI" data-start="516" tabindex="0"> Derivation Attribute </span>
    <span data-video="BhKRj3-LoBI" data-start="1390" tabindex="0">Visible expressions </span>
    <strong>Test data:</strong>
    <span data-video="BhKRj3-LoBI" data-start="2018" tabindex="0"> Tab separated data import </span>
    <span data-video="BhKRj3-LoBI" data-start="2378" tabindex="0"> Constraints </span>
    <span data-video="BhKRj3-LoBI" data-start="2548" tabindex="0"> Validation Rules </span>
    <span data-video="BhKRj3-LoBI" data-start="2876" tabindex="0"> Saving despite error warnings </span>
 
   </div>
   </div>
</div>
</div>


<script>
var IMG = document.querySelectorAll('#video12 span'),
    IFRAME = document.querySelector('#video12 iframe');
for (var i = 0; i < IMG.length; i++) {
  IMG[i].onclick = function() {
    IFRAME.src = 'http://www.youtube.com/embed/' + this.dataset.video + '?rel=0&autoplay=1';
    if(this.dataset.end) IFRAME.src = IFRAME.src.replace(/([\s\S]*)/g, '$1&end=' + this.dataset.end);
    if(this.dataset.start) IFRAME.src = IFRAME.src.replace(/([\s\S]*)/g, '$1&start=' + this.dataset.start);
    this.style.backgroundColor='rgba(0,0,0,.2)';
  }
}
</script>
</html>
</html>
 
[[Category:MDriven Designer]]
'''Raw subtitles text'''
[[Category:MDriven Designer Sessions]]
 
[[Category:Constraints]]
Hi and welcome back to MDriven designer overview
[[Category:Derivations]]
 
[[Category:Validation rules]]
and this will be session five, so we
[[Category:SQL]]
 
[[Category:Expressions]]
ended off the last session with the
[[Category:Navigation]]
 
{{Edited|July|12|2024}}
creating a modal dialog that were
 
allowed us to pick tenants to our house
 
so we could pick persons that would
 
create lease contract and when we used
 
this dialogue "all persons" to to pick
 
the tenants from and as you can
 
imagine this strategy simply will not
 
hold, if we have a million persons and
 
this is good, when we have a hundred
 
maybe, but we can't really trust on all
 
instances to come to the rescue for
 
every scenario, we really desperately
 
need some way to vSeek the database
 
without instanciating the objects in
 
memory in their client during the
 
prototyper, so how do we go about that in
 
the view model pattern that we have
 
we don't like this, we right click and among the nesting
 
choices we have add add search expression
 
and such expressions are expression step
 
are supposed to be executed in
 
persistent storage, so that will be a
 
database if your back and is connected
 
to it, to one or it will be the xml file
 
in our case, where we prototype against
 
the xml file and if we are in turn
 
key will be the persistence mapper that
 
in turn will question the backing database
 
alright, so let's just go ahead and add
 
a search expression or maybe better
 
yet, we will do a new view model to keep
 
the searching and we will column this
 
"person search" and we type it to be "person"
 
right click and in the nested view models
 
add search expression and what happened
 
here, was that three columns were
 
added to the root and one of the
 
columns was a variable called the
 
vSeek result, this variable was created
 
and added to the viewmodel well it
 
wasn't because it's implicit, but it
 
should be in the newer versions, it will
 
be and so variables are just as they sound
 
something that we can define in
 
the view model and is only available
 
in the viewmodel scope, so this one
 
should be of collection person this is
 
where our result is going to end up from
 
a search and that one we connect to a
 
search result grid, so we have another
 
variable vSeekParam that is
 
defined as a string, so we have a column
 
in the UI that lets the user enter
 
a criteria and we have his search button
 
and the search button as the ocl
 
expression "selfvm.search", "selfvm" is
 
a special instance that is available in
 
view models only from OCL, let's see
 
what it contains, "selfvm." and from
 
here we can do things as
 
refresh, save, search, and a few other
 
things, like PSexpression_refresh, we can
 
come back to these in later sessions, but
 
for now we just going to use the vm
 
search, what the search operator does is
 
it looks for search expressions in the
 
view model and this is a search
 
expression, it's just another view model
 
nesting, but what separates this from the
 
other nestings is that it is not
 
connected to anything it's judt sits here
 
in the middle, doesn't need to be in the
 
middle because I said so I can right
 
click this and move this one up, so as
 
such expression is typed and it has
 
criterias right here it's just columns you
 
can have many criteria per search expression
 
the criterias are merged
 
together with the ocl operator
 
intersection, so what if these criteria
 
is true and we had another or this
 
criteria returned five persons 12345 and
 
we had another one that return two
 
persons 45, the intersection will take
 
what's equal between the two domains
 
so 4 and 5, but the search expression
 
the criteria is just another ocl, but
 
what's different about this is that is
 
the persistent storage subset of SQL Ocl-PS
 
it sets up here in the edge
 
when we entry and then we don't have access to every single
 
operator, we can't concatenate
 
strings etc. in this language
 
its main purpose is to be easily
 
transformed to SQL and executed as an
 
SQL query to the database and the
 
database will return a number of
 
identities, that we will in turn
 
interpret as persons and load personal
 
objects, so what we do is select and we
 
have a loop variable called A then
 
the mechanism to create the search
 
expression and all this for us it just
 
took the first string attribute of the
 
class that we had set person and that
 
was first name and set, well it's not
 
unlikely that is what you as a
 
developer want to limit search of,
 
this attribute as SqlLike(vSeekParam) and ends with a +% just like in
 
Sql operator like, so if you want to find
 
both and start, if you want to find
 
values that equals in the middle
 
that you would go something like this,
 
so this will be a resulting string that's
 
add into the SqlLike, that of course
 
will be translated into a like operator
 
in sequel, but as we are running against
 
an xml file, it will do something similar
 
just execute operator on that
 
so is this really what we want
 
well, we want to also check if it's the
 
last name maybe, so I use "or" and I use "LastName", like that
 
what should I show for a result I can show the things I have
 
first name and last name
 
so let's do one thing more in this view
 
and if you don't find what you expect
 
you might want to have somewhere where
 
you can create a new person, so let's
 
totally action definitions for this
 
dialogue and let's do a viewmodel action
 
and say that we should show it on the
 
root and say new person and the
 
execute expression on this one
 
should be PersonCreate, having done that
 
we can see, if we have, we can save this
 
push the play button, start system, Run Model
 
and continue, we never created an
 
action to actually show the seeker
 
view model, so person search
 
I right click on this and say add a
 
global action for show
 
okay then it's shown here, but we
 
probably want to sort into as menu group
 
a double click it
 
find it here set menu group-seekers
 
maybe, so this is might be where I want
 
to put all my search dialogues and who
 
knows
 
having done that and I head back to this one
 
model refresh, seekers, show per person,
 
search and I can search, but I only want those
 
that has an "a" in them
 
that's the only one, okay but
 
what if someone's missing
 
I can create a new person and call that
 
Andersson Anders, now if I search for a
 
I should find Anderson, but since
 
my xml file is, I guess it is case sensitive
 
it is case sensitive, so if we don't
 
like that we should have used operator
 
called .sqlLikeCaseInSensitive, where like
 
so now we have the searcher
 
let's go back to the house view
 
where we added the pic tenants action
 
so the pick tenant action and let's do
 
a copy of this, where did he go
 
let's do a copy of this, just going to do
 
a copy and paste, and "pick tenants by search"
 
and that one should bring up the
 
person search instead and if it does
 
it cannot call "check this" because that
 
variable doesn't exist in that UI like
 
instead it calls "SearchResultGrid" if that is empty
 
ok and this expression won't go either
 
because the same problem, like that
 
and it adds the tenants if I have selected any
 
so if we head back here we see that we have
 
another action pick tenants by search
 
of course in the end, I only want one of these
 
and our most likely it's the "BySearch"
 
that will survive and then maybe
 
I will change its name, model refresh,
 
houses and pick one here,
 
this doesn't have any tenants, I'm going to pick
 
tenants by search, I'm going to search on
 
find this one and I add that one, so I find it
 
rather disturbing that I don't see the name here
 
this is what I talked about
 
before, in session 2 or something
 
first, when we do the UI
 
and watch the information together
 
that it's obvious that, of course, we need to see
 
the name here as a new requirement, but
 
it's obvious now that we see the result and that's not a problem
 
this is the grid, which is this one, which
 
points to this one and let's add the columns
 
and add a generic column and in
 
that generic column sets an expression
 
that follow the role to tenant and the
 
first name that's the ocl editor acting up
 
when you don't have a separator
 
first name and you might have noticed that
 
I quite a lot of times had a need
 
to concatenate first and the last name
 
because that's simply how we
 
refer to persons, so this
 
sort of this pattern comes back
 
again and again and we're going to solve
 
this in just a minute, just going to save
 
the fact that we did a new column
 
and we call that "tenant name" and
 
we might want to give that a little more
 
space like three columns and we might
 
want to drag this one to the end
 
here and over there, and this one and we
 
added in summary session it's just we want
 
so if I save and refresh and look at all
 
the houses, was it this one and there's
 
Andersson, but I don't want it there
 
I want it first and let's show the
 
gridlines, like that, refresh like
 
that and that's pretty obvious and
 
how come this isn't even showing, well
 
it's too tight to show with this
 
style, so how would you solve that
 
well as you can see we are cramming
 
everything into one grid cell here
 
so we're gonna insert column and
 
give this one more space for the presentation
 
let's give it 2 and just to make things
 
look straight you're going to get the
 
rest of them 2 as well, head back,
 
refresh, views, all houses, when I click it
 
would still crap but you get the
 
general idea I will just insert yet another column
 
let's judt do that one for and refresh, like that
 
so this is important how quickly
 
we can go from feedback with our eyes
 
that this isn't good back to design how should be instead
 
back to verification, okay it's fine it
 
really saves everyboy's time
 
ok enough about that, and I said that
 
this pattern is repeated again and again
 
yes it is the first name and last name
 
it's a really common scenario that we
 
want to refer to persons by their full
 
name, so what we probably would want
 
to do is add an attribute, that is called
 
full name, but that wouldn't be very
 
normalized to store the first name and
 
the last name and full name, so let's
 
make that one right, that's another
 
attribute mode, it's not persistent as it
 
is not stored in the database, it's
 
derived as it's calculated from other
 
values that we do have, so I can paste in
 
that one and now that was for the
 
tenants and I don't want that
 
because now we are in the scope of a person,
 
so first name and last name
 
this makes up the full name and now we
 
have done this and we can make use of it
 
in our view models or wherever we access
 
model information, so instead of doing
 
this we can just as well do the full
 
name, like that and now it's grey I was
 
expecting it to be pink, because it is
 
derived I wonder why that was it's derived
 
don't have an answer, but going to save
 
what do you say? self is not...
 
that was just wrong, save and head back and
 
model refresh, and there's really
 
no difference, but like here now that we have it
 
let's use it, so tenance last name
 
and tenance full name is full name we got refresh
 
if I were to change the name
 
the right attributes were like this
 
there are always subscribed, so let's head
 
back to this view and add it as well
 
just to prove a point all persons add column
 
full name,  give it some space when it's in grid too
 
maybe we refresh, views, show all persons
 
as soon as I change one of their values
 
that build up the derivation, the
 
derivation will kick in and invalidate
 
as the UI looks at this value
 
it will force it to refresh, getting the
 
parts of the value and re-evaluate it,
 
so when I write Hans it will be updated
 
and if I were to change anything
 
it will be updated and that might be
 
Dick Smith, right, so derivation is also
 
available for associations
 
so what we could do, if we want to know
 
where the person lives is of course to
 
follow to see the rented apart and
 
look up the street for that house
 
but if that is a common operation
 
that we want to do we could
 
also add a association straight from
 
person to streets and since
 
I can rent many apartments, I potentially
 
have many addresses, so if I want to
 
derive this from available information,
 
I was saying that the association is derived
 
and I will take this end, will
 
have no value so I will say that there
 
it is non navigable, is navigable
 
false, because if I would want to go from
 
street to persons that would be another
 
derivations that would have another
 
expression, but this one should have
 
a derivation expression, that it starts
 
in person and it goes to
 
here is the one that is derived it
 
goes to owned house,
 
no, to lease contract, and from lease contract
 
rented apartments, and from rented
 
apartments - the street
 
I really must fix that, the street
 
so this will be a collection of
 
streets and if we were to show this in
 
our UI, I guess we could add column and
 
add generic column, and I follow the
 
relation to streets and that has a name,
 
but since this is a collection of
 
strings, we need some way to display it
 
in a single cell that we will do here in
 
the grid and done an operator that's
 
real handy for these cases as CommaList
 
so it will take all the strings in
 
the collection and append them as they
 
with the comma in between, so lives at, so heading
 
back to refresh, views or persons, so
 
here we see the address is swelling
 
ok, so good we have covered in a lot of
 
ground we have mentioned derivations
 
for attributes like the full night
 
servations for associations like the
 
street even if it was kind of silly,
 
because we would probably would like
 
the street number to get the precise
 
address and that's not possible this way
 
we have covered the idea of being able
 
to vSeek in a lost database and then
 
we also mentioned variables that are
 
available in view models, so I'm going to
 
show you another thing and what if we
 
are in a situation where we actually
 
need some test data, we need a lot of
 
persons to verify that our idea to search in
 
larger amount is valid and of course
 
we could run the prototype print
 
and press, we added the new person action
 
here and we could press that a thousand
 
times to enter the first and last name
 
but is there a better way, you ask
 
and since I talking about it you have
 
probably guessed that there is and I go
 
into the the Run button again because
 
I need a context that we are in the
 
XML persistence, we're going to start
 
the system and we're going to go into
 
the legacy debugger and in here we have
 
a tab over here
 
"import tab separated", so tab separated
 
data import via named view model, so what it
 
says he's given tab-separated data and
 
the view model name assumes row 1 in data
 
to be viewmodel column and creates
 
instances of view model class
 
so basically, if we have some data that
 
we paste in here, we should be able to
 
create objects of certain class, but it
 
also says, that we need a view model,
 
so let's create one, as you see the view
 
models are used over and over for different purposes
 
ImportPersons and type Person and let's assume
 
the first name is the first value and
 
the last name is the second value so
 
that's about it and given that I should be able to say
 
that this is the view model I want to
 
use or maybe I need to reread this, I do
 
start, lazy debugger,
 
input tap separated and view model and
 
get header from view model,and first-name
 
lastname alright, where can I get that, I found this site
 
as google for a list of names and find
 
anything on google list of random names
 
let's do 50 and male and female and well
 
no alliteration when you start the same ok
 
now I want to grab these on listing text
 
area, that's great, I wonder if this is
 
tab separate it probably isn't and going to
 
start notepad, alright so is that a tab
 
no, I copy tab and I want to
 
do is search and replace here, look
 
for space and paste in my tab and
 
replace it all and copy those and head
 
back to my importer and paste those, and
 
go, so that means I got a lot of dirty
 
objects here that I will save like that and
 
head back to my this one is going to
 
restart, person search and I have some
 
test data to work on
 
oh let's see everyone that starts either
 
their first loss name with "t" or has a "t"
 
really because that was what we said in the criteria
 
ok, so that means that when we do houses
 
and we want to assign tenance by search
 
and we do everyone with the "T"
 
because it is case sensitive as we
 
found out and select them and press ok
 
then we have those as tenants
 
alright moving ON as we see the
 
tenants here, but they haven't got
 
an apartment number...they
 
haven't got a rent figure, but they
 
really should this is important information
 
it's so important, that we might want to
 
add constraint on our class lease
 
contract to make sure that
 
the user of the system is made aware of
 
the importance of these values
 
so I select the class and I select
 
constraints and I get a little dialogue
 
where I can add constraints this
 
constraint I give a name "must have
 
apartment number" that's the name of my
 
constraint so that I can refer to it and
 
and I want to have a description as well
 
and I'm going to make easy to myself is
 
to do something like this, that's right
 
the expression is more or
 
less self.apartmentnumber and well it
 
should be not null, right
 
shouldn't be null and then now we got
 
that symbol that says that this has one
 
constraint, so when we look at our
 
diagrams we will see that this is
 
constrained in some way
 
ok, so if we were to head back to our
 
prototyper and show the house
 
we see, must have apartment number
 
must have apartment number, but there's
 
really no information on who is missing
 
the apartment number and let's head back
 
to the constraint and in the description we can actually
 
access attributes, so and we can
 
go like this as string within the
 
larger than and smaller than, greater than and
 
tags to say that we want to describe
 
the default presentation here, can you
 
please inject that and what is the
 
default presentation, default string
 
representation on lease contract is none
 
okay, but we might follow the link to the
 
person and use the full name again we
 
made use of the derived full name
 
like that and save, and head back, refresh, view
 
all houses, so Hans Karlsen must have an
 
apartment number and Dick Smith must
 
have apartment number and as I give our
 
Hans Karlsen apartment number one
 
that is removed and as I give  Dick's one 2
 
that one removed as well, so that's a
 
good way to feedback information to the
 
user about what needs to be filled in
 
but it might not be enough for us, we
 
might need to stress these even harder depending on use case
 
so there's more ways to signal the
 
user that something needs to be done
 
if we check the house view here and we had
 
the variables that we don't use in this
 
view we use them in the seeker, but we
 
also have the the constraints, so these
 
are the constraints that we found in the
 
classes that are used here that is just
 
one and depending on use case we might
 
not want to show it because who knows
 
the view might not even contain
 
their apartment number, so no need to
 
stress the user about entering it if it
 
isn't really possible, so that we could
 
just opt it out, but we want to have it
 
opt-in because it's good for us, but what
 
we could do is something more precise as a validation rule
 
let's right-click up in the top and add
 
a validation rule, so we got rule one and
 
then the rule one is that
 
let's say it's the fact that the selected, what
 
what I want to do is to highlight something here
 
apartment number to make the user see this
 
so what is this, this is here
 
the lease contract, so what I want to do in
 
my validation rule is to find a
 
variable the current
 
the lease contract and check that one
 
that particular one that sunscreen and
 
or selected at the moment, and check that
 
for apartment number and verify that
 
isn't null, and then I can write something
 
please supply number
 
like that, but we still haven't been able
 
to say that this rule
 
is supposed to show up for this field
 
that I can select the field it's over
 
here and I'm supposed to find it and
 
validation rules, my menus really turn
 
out the wrong end all the time,
 
validation rules, rule one, please supply number
 
ok, so that would be one way to
 
further gearsteer our user to see
 
something, but how does it look
 
refresh, view, houses
 
it doesn't show anything, but if I null
 
that out first I get this one and I also
 
get the red information here
 
actually depending on what style you use
 
it really renders differently, so that
 
you can control
 
this and we have examples, where you just
 
have an "!" that was when you point that
 
it states what's wrong with it
 
so this is another important thing I
 
should mention that,when you have errors
 
and there's some something and updated
 
in  the information and you try to
 
save then it will ask you, there are
 
errors in the information, do you really
 
want to save anyway? "Hans Karlsen must
 
have apartment number" and the system
 
won't stop you from saving and this is
 
an important principle I think, that you
 
shouldn't stop the user from entering
 
information, even if it isn't correct
 
then it's better to to monitor all the
 
information that is in incorrect, so that
 
they can come back to it then and update
 
it don't stop users from entering data
 
and make a UI very clear, what you expect
 
but you should always
 
always honor the users' request to
 
save and maybe you should work with
 
the quality attributes like states that
 
you can't go into approved, before you
 
have apartment number or the rent in
 
dollars, but you shouldn't stop them from saving
 
ok, that's just my very clear view on this
 
ok, so I'm going to save it anyway, but run
 
nice wouldn't you say
 
just having the area information this
 
way, so whenever I enter something the
 
error goes away and of course I don't
 
get the warning, when I save, but that was
 
not a very good side for this example, so
 
switch back, so let's add
 
another constraint and we make that
 
not to error constraint, but rather look at
 
the other types of constraints, so we
 
have a constraint the "rent" and
 
the description and we do as we before "<as
 
string> lives free" and
 
we don't do an error just the information
 
expression would be self.rent->not null
 
because when the expression
 
is true then the constraint is
 
fulfilled and we don't shoe anything, but
 
as soon as the constraint is not true
 
then it's broken and then we show warning signs etc.
 
in this case information
 
refresh and now it's a little white
 
thing is Hans Karlsen lives free
 
shouldn't be the case that let them say alright
 
I wonder if we will have time to
 
cramming reports in this, so that we
 
could do rents and rents slips for these guys
 
I think maybe we'll come back to
 
that in the next session so we will
 
round this off and thank you very much
 
for following along with these tutorials and I'll be back

Latest revision as of 15:44, 10 February 2024

We created a Seeker that translates OCL to SQL for searching in databases of any size. We look at derivations, constraints, and validation rules.

To make your experience smooth, we set the main tags mentioned in the video to the right bar menu of this mini-player. Choose an interesting subtitle on the list and immediately get to the exact theme navigation item place in the video. Now you can pick any topic to be instructed on without watching the whole video.

View Model Editor: Search expressions Variables and Validations Derivation Attribute Visible expressions
Test data: Tab separated data import Constraints Validation Rules Saving despite error warnings

This page was edited 90 days ago on 02/10/2024. What links here